19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2006 The Android Open Source Project 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License. 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License. 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage com.android.internal.telephony.gsm; 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Context; 19767a662ecde33c3979bf02b793d392aca0403162Wink Savilleimport android.os.AsyncResult; 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Handler; 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Looper; 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Message; 23767a662ecde33c3979bf02b793d392aca0403162Wink Savilleimport android.os.PowerManager; 24767a662ecde33c3979bf02b793d392aca0403162Wink Savilleimport android.os.Registrant; 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.SystemClock; 26767a662ecde33c3979bf02b793d392aca0403162Wink Savilleimport android.util.Log; 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.telephony.PhoneNumberUtils; 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.telephony.ServiceState; 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 30767a662ecde33c3979bf02b793d392aca0403162Wink Savilleimport com.android.internal.telephony.*; 31767a662ecde33c3979bf02b793d392aca0403162Wink Saville 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@hide} 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 35767a662ecde33c3979bf02b793d392aca0403162Wink Savillepublic class GsmConnection extends Connection { 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final String LOG_TAG = "GSM"; 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //***** Instance Variables 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 40767a662ecde33c3979bf02b793d392aca0403162Wink Saville GsmCallTracker owner; 41767a662ecde33c3979bf02b793d392aca0403162Wink Saville GsmCall parent; 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String address; // MAY BE NULL!!! 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String dialString; // outgoing calls only 45767a662ecde33c3979bf02b793d392aca0403162Wink Saville String postDialString; // outgoing calls only 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean isIncoming; 47767a662ecde33c3979bf02b793d392aca0403162Wink Saville boolean disconnected; 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 49767a662ecde33c3979bf02b793d392aca0403162Wink Saville int index; // index in GsmCallTracker.connections[], -1 if unassigned 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // The GSM index is 1 + this 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * These time/timespan values are based on System.currentTimeMillis(), 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * i.e., "wall clock" time. 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long createTime; 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long connectTime; 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long disconnectTime; 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * These time/timespan values are based on SystemClock.elapsedRealTime(), 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * i.e., time since boot. They are appropriate for comparison and 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * calculating deltas. 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long connectTimeReal; 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long duration; 67767a662ecde33c3979bf02b793d392aca0403162Wink Saville long holdingStartTime; // The time when the Connection last transitioned 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // into HOLDING 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int nextPostDialChar; // index into postDialString 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project DisconnectCause cause = DisconnectCause.NOT_DISCONNECTED; 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PostDialState postDialState = PostDialState.NOT_STARTED; 74105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project int numberPresentation = Connection.PRESENTATION_ALLOWED; 7524440cf8a9431291bdcaa77b418e6c4715932507Naveen Kalla UUSInfo uusInfo; 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Handler h; 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private PowerManager.WakeLock mPartialWakeLock; 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //***** Event Constants 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final int EVENT_DTMF_DONE = 1; 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final int EVENT_PAUSE_DONE = 2; 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final int EVENT_NEXT_POST_DIAL = 3; 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final int EVENT_WAKE_LOCK_TIMEOUT = 4; 862563a3ac05dd3cf8a07203ae682c243f2e793137Wink Saville 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //***** Constants 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final int PAUSE_DELAY_FIRST_MILLIS = 100; 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final int PAUSE_DELAY_MILLIS = 3 * 1000; 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final int WAKE_LOCK_TIMEOUT_MILLIS = 60*1000; 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //***** Inner Classes 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project class MyHandler extends Handler { 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project MyHandler(Looper l) {super(l);} 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void 98767a662ecde33c3979bf02b793d392aca0403162Wink Saville handleMessage(Message msg) { 99767a662ecde33c3979bf02b793d392aca0403162Wink Saville 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (msg.what) { 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case EVENT_NEXT_POST_DIAL: 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case EVENT_DTMF_DONE: 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case EVENT_PAUSE_DONE: 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project processNextPostDialChar(); 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case EVENT_WAKE_LOCK_TIMEOUT: 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project releaseWakeLock(); 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //***** Constructors 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** This is probably an MT call that we first saw in a CLCC response */ 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /*package*/ 117767a662ecde33c3979bf02b793d392aca0403162Wink Saville GsmConnection (Context context, DriverCall dc, GsmCallTracker ct, int index) { 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project createWakeLock(context); 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project acquireWakeLock(); 1202563a3ac05dd3cf8a07203ae682c243f2e793137Wink Saville 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project owner = ct; 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project h = new MyHandler(owner.getLooper()); 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project address = dc.number; 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project isIncoming = dc.isMT; 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project createTime = System.currentTimeMillis(); 128105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project numberPresentation = dc.numberPresentation; 12924440cf8a9431291bdcaa77b418e6c4715932507Naveen Kalla uusInfo = dc.uusInfo; 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.index = index; 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project parent = parentFromDCState (dc.state); 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project parent.attach(this, dc); 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** This is an MO call, created when dialing */ 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /*package*/ 139767a662ecde33c3979bf02b793d392aca0403162Wink Saville GsmConnection (Context context, String dialString, GsmCallTracker ct, GsmCall parent) { 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project createWakeLock(context); 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project acquireWakeLock(); 1422563a3ac05dd3cf8a07203ae682c243f2e793137Wink Saville 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project owner = ct; 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project h = new MyHandler(owner.getLooper()); 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.dialString = dialString; 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1489e534153264138cfee383c626db92b934fafc1afTammo Spalink this.address = PhoneNumberUtils.extractNetworkPortionAlt(dialString); 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.postDialString = PhoneNumberUtils.extractPostDialPortion(dialString); 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project index = -1; 1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project isIncoming = false; 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project createTime = System.currentTimeMillis(); 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.parent = parent; 157767a662ecde33c3979bf02b793d392aca0403162Wink Saville parent.attachFake(this, GsmCall.State.DIALING); 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 159767a662ecde33c3979bf02b793d392aca0403162Wink Saville 160767a662ecde33c3979bf02b793d392aca0403162Wink Saville public void dispose() { 161767a662ecde33c3979bf02b793d392aca0403162Wink Saville } 162767a662ecde33c3979bf02b793d392aca0403162Wink Saville 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static boolean 164767a662ecde33c3979bf02b793d392aca0403162Wink Saville equalsHandlesNulls (Object a, Object b) { 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (a == null) ? (b == null) : a.equals (b); 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /*package*/ boolean 169767a662ecde33c3979bf02b793d392aca0403162Wink Saville compareTo(DriverCall c) { 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // On mobile originated (MO) calls, the phone number may have changed 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // due to a SIM Toolkit call control modification. 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // We assume we know when MO calls are created (since we created them) 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // and therefore don't need to compare the phone number anyway. 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (! (isIncoming || c.isMT)) return true; 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // ... but we can compare phone numbers on MT calls, and we have 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // no control over when they begin, so we might as well 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String cAddress = PhoneNumberUtils.stringFromStringAndTOA(c.number, c.TOA); 181767a662ecde33c3979bf02b793d392aca0403162Wink Saville return isIncoming == c.isMT && equalsHandlesNulls(address, cAddress); 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 184767a662ecde33c3979bf02b793d392aca0403162Wink Saville public String getAddress() { 185767a662ecde33c3979bf02b793d392aca0403162Wink Saville return address; 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 188767a662ecde33c3979bf02b793d392aca0403162Wink Saville public GsmCall getCall() { 1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return parent; 1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 192767a662ecde33c3979bf02b793d392aca0403162Wink Saville public long getCreateTime() { 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return createTime; 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 196767a662ecde33c3979bf02b793d392aca0403162Wink Saville public long getConnectTime() { 1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return connectTime; 1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 200767a662ecde33c3979bf02b793d392aca0403162Wink Saville public long getDisconnectTime() { 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return disconnectTime; 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 204767a662ecde33c3979bf02b793d392aca0403162Wink Saville public long getDurationMillis() { 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (connectTimeReal == 0) { 2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (duration == 0) { 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return SystemClock.elapsedRealtime() - connectTimeReal; 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return duration; 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 214767a662ecde33c3979bf02b793d392aca0403162Wink Saville public long getHoldDurationMillis() { 215767a662ecde33c3979bf02b793d392aca0403162Wink Saville if (getState() != GsmCall.State.HOLDING) { 2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // If not holding, return 0 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return SystemClock.elapsedRealtime() - holdingStartTime; 2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 223767a662ecde33c3979bf02b793d392aca0403162Wink Saville public DisconnectCause getDisconnectCause() { 2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return cause; 2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 227767a662ecde33c3979bf02b793d392aca0403162Wink Saville public boolean isIncoming() { 2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return isIncoming; 2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 231767a662ecde33c3979bf02b793d392aca0403162Wink Saville public GsmCall.State getState() { 2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (disconnected) { 233767a662ecde33c3979bf02b793d392aca0403162Wink Saville return GsmCall.State.DISCONNECTED; 234767a662ecde33c3979bf02b793d392aca0403162Wink Saville } else { 2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return super.getState(); 2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 239767a662ecde33c3979bf02b793d392aca0403162Wink Saville public void hangup() throws CallStateException { 240767a662ecde33c3979bf02b793d392aca0403162Wink Saville if (!disconnected) { 2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project owner.hangup(this); 2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new CallStateException ("disconnected"); 2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 247767a662ecde33c3979bf02b793d392aca0403162Wink Saville public void separate() throws CallStateException { 248767a662ecde33c3979bf02b793d392aca0403162Wink Saville if (!disconnected) { 2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project owner.separate(this); 2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new CallStateException ("disconnected"); 2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 255767a662ecde33c3979bf02b793d392aca0403162Wink Saville public PostDialState getPostDialState() { 2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return postDialState; 2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 259767a662ecde33c3979bf02b793d392aca0403162Wink Saville public void proceedAfterWaitChar() { 2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (postDialState != PostDialState.WAIT) { 261767a662ecde33c3979bf02b793d392aca0403162Wink Saville Log.w(LOG_TAG, "GsmConnection.proceedAfterWaitChar(): Expected " 2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + "getPostDialState() to be WAIT but was " + postDialState); 2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setPostDialState(PostDialState.STARTED); 2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project processNextPostDialChar(); 2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 270767a662ecde33c3979bf02b793d392aca0403162Wink Saville 2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void proceedAfterWildChar(String str) { 2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (postDialState != PostDialState.WILD) { 273767a662ecde33c3979bf02b793d392aca0403162Wink Saville Log.w(LOG_TAG, "GsmConnection.proceedAfterWaitChar(): Expected " 2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + "getPostDialState() to be WILD but was " + postDialState); 2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setPostDialState(PostDialState.STARTED); 2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (false) { 2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean playedTone = false; 2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int len = (str != null ? str.length() : 0); 2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<len; i++) { 2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project char c = str.charAt(i); 2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Message msg = null; 2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (i == len-1) { 2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project msg = h.obtainMessage(EVENT_DTMF_DONE); 2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (PhoneNumberUtils.is12Key(c)) { 2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project owner.cm.sendDtmf(c, msg); 2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project playedTone = true; 2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!playedTone) { 2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project processNextPostDialChar(); 3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // make a new postDialString, with the wild char replacement string 3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // at the beginning, followed by the remaining postDialString. 3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project StringBuilder buf = new StringBuilder(str); 3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project buf.append(postDialString.substring(nextPostDialChar)); 3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project postDialString = buf.toString(); 3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project nextPostDialChar = 0; 3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (Phone.DEBUG_PHONE) { 310767a662ecde33c3979bf02b793d392aca0403162Wink Saville log("proceedAfterWildChar: new postDialString is " + 3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project postDialString); 3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project processNextPostDialChar(); 3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 317767a662ecde33c3979bf02b793d392aca0403162Wink Saville 318767a662ecde33c3979bf02b793d392aca0403162Wink Saville public void cancelPostDial() { 3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setPostDialState(PostDialState.CANCELLED); 3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 322767a662ecde33c3979bf02b793d392aca0403162Wink Saville /** 3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Called when this Connection is being hung up locally (eg, user pressed "end") 3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Note that at this point, the hangup request has been dispatched to the radio 325767a662ecde33c3979bf02b793d392aca0403162Wink Saville * but no response has yet been received so update() has not yet been called 3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void 328767a662ecde33c3979bf02b793d392aca0403162Wink Saville onHangupLocal() { 3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cause = DisconnectCause.LOCAL; 3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project DisconnectCause 333767a662ecde33c3979bf02b793d392aca0403162Wink Saville disconnectCauseFromCode(int causeCode) { 3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See 22.001 Annex F.4 for mapping of cause codes 3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to local tones 3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 338767a662ecde33c3979bf02b793d392aca0403162Wink Saville 3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (causeCode) { 3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case CallFailCause.USER_BUSY: 3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return DisconnectCause.BUSY; 3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case CallFailCause.NO_CIRCUIT_AVAIL: 3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case CallFailCause.TEMPORARY_FAILURE: 3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case CallFailCause.SWITCHING_CONGESTION: 3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case CallFailCause.CHANNEL_NOT_AVAIL: 3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case CallFailCause.QOS_NOT_AVAIL: 3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case CallFailCause.BEARER_NOT_AVAIL: 3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return DisconnectCause.CONGESTION; 3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case CallFailCause.ACM_LIMIT_EXCEEDED: 3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return DisconnectCause.LIMIT_EXCEEDED; 3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case CallFailCause.CALL_BARRED: 3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return DisconnectCause.CALL_BARRED; 3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case CallFailCause.FDN_BLOCKED: 3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return DisconnectCause.FDN_BLOCKED; 3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3606308e48d40e72a53ddaf7881e1c95223ddf33b5dNaveen Kalla case CallFailCause.UNOBTAINABLE_NUMBER: 3616308e48d40e72a53ddaf7881e1c95223ddf33b5dNaveen Kalla return DisconnectCause.UNOBTAINABLE_NUMBER; 3626308e48d40e72a53ddaf7881e1c95223ddf33b5dNaveen Kalla 3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case CallFailCause.ERROR_UNSPECIFIED: 364767a662ecde33c3979bf02b793d392aca0403162Wink Saville case CallFailCause.NORMAL_CLEARING: 3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project default: 3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project GSMPhone phone = owner.phone; 3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int serviceState = phone.getServiceState().getState(); 3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (serviceState == ServiceState.STATE_POWER_OFF) { 3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return DisconnectCause.POWER_OFF; 3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (serviceState == ServiceState.STATE_OUT_OF_SERVICE 3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project || serviceState == ServiceState.STATE_EMERGENCY_ONLY ) { 3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return DisconnectCause.OUT_OF_SERVICE; 373e7af59b375f08b13d964816fc52048e670764bdbAlex Yakavenka } else if (phone.getIccCard().getState() != IccCard.State.READY) { 374767a662ecde33c3979bf02b793d392aca0403162Wink Saville return DisconnectCause.ICC_ERROR; 3754df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project } else if (causeCode == CallFailCause.ERROR_UNSPECIFIED) { 3768c6452dd3cf5d7d260e1fec5cb77f500f1966daaRobert Greenwalt if (phone.mSST.mRestrictedState.isCsRestricted()) { 3772563a3ac05dd3cf8a07203ae682c243f2e793137Wink Saville return DisconnectCause.CS_RESTRICTED; 3788c6452dd3cf5d7d260e1fec5cb77f500f1966daaRobert Greenwalt } else if (phone.mSST.mRestrictedState.isCsEmergencyRestricted()) { 3794df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project return DisconnectCause.CS_RESTRICTED_EMERGENCY; 3808c6452dd3cf5d7d260e1fec5cb77f500f1966daaRobert Greenwalt } else if (phone.mSST.mRestrictedState.isCsNormalRestricted()) { 3814df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project return DisconnectCause.CS_RESTRICTED_NORMAL; 3824df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project } else { 383eafe72a0db89b5867ccd4b8170377309827785a2Satish.Kulkarni return DisconnectCause.ERROR_UNSPECIFIED; 3844df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project } 385eafe72a0db89b5867ccd4b8170377309827785a2Satish.Kulkarni } else if (causeCode == CallFailCause.NORMAL_CLEARING) { 3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return DisconnectCause.NORMAL; 387eafe72a0db89b5867ccd4b8170377309827785a2Satish.Kulkarni } else { 388eafe72a0db89b5867ccd4b8170377309827785a2Satish.Kulkarni // If nothing else matches, report unknown call drop reason 389eafe72a0db89b5867ccd4b8170377309827785a2Satish.Kulkarni // to app, not NORMAL call end. 390eafe72a0db89b5867ccd4b8170377309827785a2Satish.Kulkarni return DisconnectCause.ERROR_UNSPECIFIED; 3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /*package*/ void 396767a662ecde33c3979bf02b793d392aca0403162Wink Saville onRemoteDisconnect(int causeCode) { 3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project onDisconnect(disconnectCauseFromCode(causeCode)); 3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** Called when the radio indicates the connection has been disconnected */ 4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /*package*/ void 402767a662ecde33c3979bf02b793d392aca0403162Wink Saville onDisconnect(DisconnectCause cause) { 4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.cause = cause; 404767a662ecde33c3979bf02b793d392aca0403162Wink Saville 405767a662ecde33c3979bf02b793d392aca0403162Wink Saville if (!disconnected) { 4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project index = -1; 407767a662ecde33c3979bf02b793d392aca0403162Wink Saville 4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project disconnectTime = System.currentTimeMillis(); 4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project duration = SystemClock.elapsedRealtime() - connectTimeReal; 4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project disconnected = true; 4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 41243a17654cf4bfe7f1ec22bd8b7b32daccdf27c09Joe Onorato if (false) Log.d(LOG_TAG, 4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "[GSMConn] onDisconnect: cause=" + cause); 4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project owner.phone.notifyDisconnect(this); 4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (parent != null) { 418767a662ecde33c3979bf02b793d392aca0403162Wink Saville parent.connectionDisconnected(this); 4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project releaseWakeLock(); 4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Returns true if state has changed, false if nothing changed 4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /*package*/ boolean 4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project update (DriverCall dc) { 427767a662ecde33c3979bf02b793d392aca0403162Wink Saville GsmCall newParent; 4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean changed = false; 4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean wasConnectingInOrOut = isConnectingInOrOut(); 430767a662ecde33c3979bf02b793d392aca0403162Wink Saville boolean wasHolding = (getState() == GsmCall.State.HOLDING); 4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project newParent = parentFromDCState(dc.state); 4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!equalsHandlesNulls(address, dc.number)) { 4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (Phone.DEBUG_PHONE) log("update: phone # changed!"); 4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project address = dc.number; 4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project changed = true; 4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (newParent != parent) { 4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (parent != null) { 4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project parent.detach(this); 4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project newParent.attach(this, dc); 4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project parent = newParent; 4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project changed = true; 4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean parentStateChange; 4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project parentStateChange = parent.update (this, dc); 4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project changed = changed || parentStateChange; 4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** Some state-transition events */ 4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (Phone.DEBUG_PHONE) log( 4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "update: parent=" + parent + 4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ", hasNewParent=" + (newParent != parent) + 4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ", wasConnectingInOrOut=" + wasConnectingInOrOut + 4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ", wasHolding=" + wasHolding + 4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ", isConnectingInOrOut=" + isConnectingInOrOut() + 4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ", changed=" + changed); 4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (wasConnectingInOrOut && !isConnectingInOrOut()) { 4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project onConnectedInOrOut(); 4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 468767a662ecde33c3979bf02b793d392aca0403162Wink Saville if (changed && !wasHolding && (getState() == GsmCall.State.HOLDING)) { 4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // We've transitioned into HOLDING 4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project onStartedHolding(); 4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return changed; 4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Called when this Connection is in the foregroundCall 4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * when a dial is initiated. 4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * We know we're ACTIVE, and we know we're going to end up 4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * HOLDING in the backgroundCall 4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void 483767a662ecde33c3979bf02b793d392aca0403162Wink Saville fakeHoldBeforeDial() { 4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (parent != null) { 4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project parent.detach(this); 4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project parent = owner.backgroundCall; 489767a662ecde33c3979bf02b793d392aca0403162Wink Saville parent.attachFake(this, GsmCall.State.HOLDING); 4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project onStartedHolding(); 4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /*package*/ int 4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project getGSMIndex() throws CallStateException { 4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (index >= 0) { 4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return index + 1; 4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new CallStateException ("GSM index not yet assigned"); 5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * An incoming or outgoing call has connected 5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void 5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project onConnectedInOrOut() { 5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project connectTime = System.currentTimeMillis(); 5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project connectTimeReal = SystemClock.elapsedRealtime(); 5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project duration = 0; 5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // bug #678474: incoming call interpreted as missed call, even though 5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // it sounds like the user has picked up the call. 5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (Phone.DEBUG_PHONE) { 5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project log("onConnectedInOrOut: connectTime=" + connectTime); 5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!isIncoming) { 5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // outgoing calls only 5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project processNextPostDialChar(); 5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project releaseWakeLock(); 5239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void 5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project onStartedHolding() { 5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project holdingStartTime = SystemClock.elapsedRealtime(); 5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Performs the appropriate action for a post-dial char, but does not 5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * notify application. returns false if the character is invalid and 5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * should be ignored 5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean 535767a662ecde33c3979bf02b793d392aca0403162Wink Saville processPostDialChar(char c) { 5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (PhoneNumberUtils.is12Key(c)) { 5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project owner.cm.sendDtmf(c, h.obtainMessage(EVENT_DTMF_DONE)); 5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (c == PhoneNumberUtils.PAUSE) { 5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // From TS 22.101: 5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 541767a662ecde33c3979bf02b793d392aca0403162Wink Saville // "The first occurrence of the "DTMF Control Digits Separator" 542767a662ecde33c3979bf02b793d392aca0403162Wink Saville // shall be used by the ME to distinguish between the addressing 5439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // digits (i.e. the phone number) and the DTMF digits...." 5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (nextPostDialChar == 1) { 5469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // The first occurrence. 5479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // We don't need to pause here, but wait for just a bit anyway 548767a662ecde33c3979bf02b793d392aca0403162Wink Saville h.sendMessageDelayed(h.obtainMessage(EVENT_PAUSE_DONE), 5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PAUSE_DELAY_FIRST_MILLIS); 5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // It continues... 552767a662ecde33c3979bf02b793d392aca0403162Wink Saville // "Upon subsequent occurrences of the separator, the UE shall 553767a662ecde33c3979bf02b793d392aca0403162Wink Saville // pause again for 3 seconds (\u00B1 20 %) before sending any 5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // further DTMF digits." 555767a662ecde33c3979bf02b793d392aca0403162Wink Saville h.sendMessageDelayed(h.obtainMessage(EVENT_PAUSE_DONE), 5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PAUSE_DELAY_MILLIS); 5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (c == PhoneNumberUtils.WAIT) { 5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setPostDialState(PostDialState.WAIT); 5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (c == PhoneNumberUtils.WILD) { 5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setPostDialState(PostDialState.WILD); 5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String 570767a662ecde33c3979bf02b793d392aca0403162Wink Saville getRemainingPostDialString() { 571767a662ecde33c3979bf02b793d392aca0403162Wink Saville if (postDialState == PostDialState.CANCELLED 5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project || postDialState == PostDialState.COMPLETE 5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project || postDialString == null 5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project || postDialString.length() <= nextPostDialChar 5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ) { 5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return ""; 5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return postDialString.substring(nextPostDialChar); 5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5812563a3ac05dd3cf8a07203ae682c243f2e793137Wink Saville 5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void finalize() 5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * It is understood that This finializer is not guaranteed 5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to be called and the release lock call is here just in 5889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * case there is some path that doesn't call onDisconnect 5899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * and or onConnectedInOrOut. 5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mPartialWakeLock.isHeld()) { 5929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.e(LOG_TAG, "[GSMConn] UNEXPECTED; mPartialWakeLock is held when finalizing."); 5939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project releaseWakeLock(); 5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void 598767a662ecde33c3979bf02b793d392aca0403162Wink Saville processNextPostDialChar() { 5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project char c = 0; 6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Registrant postDialHandler; 6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (postDialState == PostDialState.CANCELLED) { 6039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //Log.v("GSM", "##### processNextPostDialChar: postDialState == CANCELLED, bail"); 6049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 6059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (postDialString == null || 6089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project postDialString.length() <= nextPostDialChar) { 6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setPostDialState(PostDialState.COMPLETE); 6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // notifyMessage.arg1 is 0 on complete 6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project c = 0; 6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 6149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean isValid; 6152563a3ac05dd3cf8a07203ae682c243f2e793137Wink Saville 6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setPostDialState(PostDialState.STARTED); 6179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project c = postDialString.charAt(nextPostDialChar++); 6199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project isValid = processPostDialChar(c); 6219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!isValid) { 6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Will call processNextPostDialChar 6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project h.obtainMessage(EVENT_NEXT_POST_DIAL).sendToTarget(); 6259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Don't notify application 6269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.e("GSM", "processNextPostDialChar: c=" + c + " isn't valid!"); 6279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 6289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project postDialHandler = owner.phone.mPostDialHandler; 6329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Message notifyMessage; 6349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 635767a662ecde33c3979bf02b793d392aca0403162Wink Saville if (postDialHandler != null 636767a662ecde33c3979bf02b793d392aca0403162Wink Saville && (notifyMessage = postDialHandler.messageForRegistrant()) != null) { 6379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // The AsyncResult.result is the Connection object 6389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PostDialState state = postDialState; 6399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AsyncResult ar = AsyncResult.forMessage(notifyMessage); 6409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ar.result = this; 6419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ar.userObj = state; 6429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // arg1 is the character that was/is being processed 6449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project notifyMessage.arg1 = c; 6459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //Log.v("GSM", "##### processNextPostDialChar: send msg to postDialHandler, arg1=" + c); 6479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project notifyMessage.sendToTarget(); 6489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** "connecting" means "has never been ACTIVE" for both incoming 6539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * and outgoing calls 6549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean 656767a662ecde33c3979bf02b793d392aca0403162Wink Saville isConnectingInOrOut() { 657767a662ecde33c3979bf02b793d392aca0403162Wink Saville return parent == null || parent == owner.ringingCall 658767a662ecde33c3979bf02b793d392aca0403162Wink Saville || parent.state == GsmCall.State.DIALING 659767a662ecde33c3979bf02b793d392aca0403162Wink Saville || parent.state == GsmCall.State.ALERTING; 6609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 662767a662ecde33c3979bf02b793d392aca0403162Wink Saville private GsmCall 663767a662ecde33c3979bf02b793d392aca0403162Wink Saville parentFromDCState (DriverCall.State state) { 6649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (state) { 6659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case ACTIVE: 6669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case DIALING: 6679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case ALERTING: 6689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return owner.foregroundCall; 6699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //break; 6709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case HOLDING: 6729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return owner.backgroundCall; 6739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //break; 6749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case INCOMING: 6769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case WAITING: 6779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return owner.ringingCall; 6789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //break; 6799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project default: 6819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new RuntimeException("illegal call state: " + state); 6829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6862563a3ac05dd3cf8a07203ae682c243f2e793137Wink Saville * Set post dial state and acquire wake lock while switching to "started" 6872563a3ac05dd3cf8a07203ae682c243f2e793137Wink Saville * state, the wake lock will be released if state switches out of "started" 6882563a3ac05dd3cf8a07203ae682c243f2e793137Wink Saville * state or after WAKE_LOCK_TIMEOUT_MILLIS. 6899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param s new PostDialState 6909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void setPostDialState(PostDialState s) { 6922563a3ac05dd3cf8a07203ae682c243f2e793137Wink Saville if (postDialState != PostDialState.STARTED 6939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && s == PostDialState.STARTED) { 6949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project acquireWakeLock(); 6959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Message msg = h.obtainMessage(EVENT_WAKE_LOCK_TIMEOUT); 6969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project h.sendMessageDelayed(msg, WAKE_LOCK_TIMEOUT_MILLIS); 6972563a3ac05dd3cf8a07203ae682c243f2e793137Wink Saville } else if (postDialState == PostDialState.STARTED 6989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && s != PostDialState.STARTED) { 6999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project h.removeMessages(EVENT_WAKE_LOCK_TIMEOUT); 7009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project releaseWakeLock(); 7019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project postDialState = s; 7039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7042563a3ac05dd3cf8a07203ae682c243f2e793137Wink Saville 7059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void 7069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project createWakeLock(Context context) { 7079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE); 7089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPartialWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, LOG_TAG); 7099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7102563a3ac05dd3cf8a07203ae682c243f2e793137Wink Saville 7119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void 7129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project acquireWakeLock() { 7139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project log("acquireWakeLock"); 7149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPartialWakeLock.acquire(); 7159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void 7189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project releaseWakeLock() { 7199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized(mPartialWakeLock) { 7209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mPartialWakeLock.isHeld()) { 7219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project log("releaseWakeLock"); 7229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPartialWakeLock.release(); 7239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7262563a3ac05dd3cf8a07203ae682c243f2e793137Wink Saville 7279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void log(String msg) { 7289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.d(LOG_TAG, "[GSMConn] " + msg); 7299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 730105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 731105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project @Override 732105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project public int getNumberPresentation() { 733105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project return numberPresentation; 734105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 73524440cf8a9431291bdcaa77b418e6c4715932507Naveen Kalla 73624440cf8a9431291bdcaa77b418e6c4715932507Naveen Kalla @Override 73724440cf8a9431291bdcaa77b418e6c4715932507Naveen Kalla public UUSInfo getUUSInfo() { 73824440cf8a9431291bdcaa77b418e6c4715932507Naveen Kalla return uusInfo; 73924440cf8a9431291bdcaa77b418e6c4715932507Naveen Kalla } 7409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 741