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; 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Config; 27767a662ecde33c3979bf02b793d392aca0403162Wink Savilleimport android.util.Log; 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.telephony.PhoneNumberUtils; 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.telephony.ServiceState; 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 31767a662ecde33c3979bf02b793d392aca0403162Wink Savilleimport com.android.internal.telephony.*; 32767a662ecde33c3979bf02b793d392aca0403162Wink Saville 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@hide} 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 36767a662ecde33c3979bf02b793d392aca0403162Wink Savillepublic class GsmConnection extends Connection { 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final String LOG_TAG = "GSM"; 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //***** Instance Variables 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 41767a662ecde33c3979bf02b793d392aca0403162Wink Saville GsmCallTracker owner; 42767a662ecde33c3979bf02b793d392aca0403162Wink Saville GsmCall parent; 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String address; // MAY BE NULL!!! 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String dialString; // outgoing calls only 46767a662ecde33c3979bf02b793d392aca0403162Wink Saville String postDialString; // outgoing calls only 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean isIncoming; 48767a662ecde33c3979bf02b793d392aca0403162Wink Saville boolean disconnected; 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 50767a662ecde33c3979bf02b793d392aca0403162Wink Saville int index; // index in GsmCallTracker.connections[], -1 if unassigned 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // The GSM index is 1 + this 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * These time/timespan values are based on System.currentTimeMillis(), 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * i.e., "wall clock" time. 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long createTime; 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long connectTime; 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long disconnectTime; 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * These time/timespan values are based on SystemClock.elapsedRealTime(), 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * i.e., time since boot. They are appropriate for comparison and 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * calculating deltas. 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long connectTimeReal; 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long duration; 68767a662ecde33c3979bf02b793d392aca0403162Wink Saville long holdingStartTime; // The time when the Connection last transitioned 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // into HOLDING 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int nextPostDialChar; // index into postDialString 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project DisconnectCause cause = DisconnectCause.NOT_DISCONNECTED; 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PostDialState postDialState = PostDialState.NOT_STARTED; 75105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project int numberPresentation = Connection.PRESENTATION_ALLOWED; 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; 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.index = index; 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project parent = parentFromDCState (dc.state); 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project parent.attach(this, dc); 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** This is an MO call, created when dialing */ 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /*package*/ 138767a662ecde33c3979bf02b793d392aca0403162Wink Saville GsmConnection (Context context, String dialString, GsmCallTracker ct, GsmCall parent) { 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project createWakeLock(context); 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project acquireWakeLock(); 1412563a3ac05dd3cf8a07203ae682c243f2e793137Wink Saville 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project owner = ct; 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project h = new MyHandler(owner.getLooper()); 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.dialString = dialString; 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1479e534153264138cfee383c626db92b934fafc1afTammo Spalink this.address = PhoneNumberUtils.extractNetworkPortionAlt(dialString); 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.postDialString = PhoneNumberUtils.extractPostDialPortion(dialString); 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project index = -1; 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project isIncoming = false; 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project createTime = System.currentTimeMillis(); 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.parent = parent; 156767a662ecde33c3979bf02b793d392aca0403162Wink Saville parent.attachFake(this, GsmCall.State.DIALING); 1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 158767a662ecde33c3979bf02b793d392aca0403162Wink Saville 159767a662ecde33c3979bf02b793d392aca0403162Wink Saville public void dispose() { 160767a662ecde33c3979bf02b793d392aca0403162Wink Saville } 161767a662ecde33c3979bf02b793d392aca0403162Wink Saville 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static boolean 163767a662ecde33c3979bf02b793d392aca0403162Wink Saville equalsHandlesNulls (Object a, Object b) { 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (a == null) ? (b == null) : a.equals (b); 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /*package*/ boolean 168767a662ecde33c3979bf02b793d392aca0403162Wink Saville compareTo(DriverCall c) { 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // On mobile originated (MO) calls, the phone number may have changed 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // due to a SIM Toolkit call control modification. 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // We assume we know when MO calls are created (since we created them) 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // and therefore don't need to compare the phone number anyway. 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (! (isIncoming || c.isMT)) return true; 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // ... but we can compare phone numbers on MT calls, and we have 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // no control over when they begin, so we might as well 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String cAddress = PhoneNumberUtils.stringFromStringAndTOA(c.number, c.TOA); 180767a662ecde33c3979bf02b793d392aca0403162Wink Saville return isIncoming == c.isMT && equalsHandlesNulls(address, cAddress); 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 183767a662ecde33c3979bf02b793d392aca0403162Wink Saville public String getAddress() { 184767a662ecde33c3979bf02b793d392aca0403162Wink Saville return address; 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 187767a662ecde33c3979bf02b793d392aca0403162Wink Saville public GsmCall getCall() { 1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return parent; 1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 191767a662ecde33c3979bf02b793d392aca0403162Wink Saville public long getCreateTime() { 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return createTime; 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 195767a662ecde33c3979bf02b793d392aca0403162Wink Saville public long getConnectTime() { 1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return connectTime; 1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 199767a662ecde33c3979bf02b793d392aca0403162Wink Saville public long getDisconnectTime() { 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return disconnectTime; 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 203767a662ecde33c3979bf02b793d392aca0403162Wink Saville public long getDurationMillis() { 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (connectTimeReal == 0) { 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (duration == 0) { 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return SystemClock.elapsedRealtime() - connectTimeReal; 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return duration; 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 213767a662ecde33c3979bf02b793d392aca0403162Wink Saville public long getHoldDurationMillis() { 214767a662ecde33c3979bf02b793d392aca0403162Wink Saville if (getState() != GsmCall.State.HOLDING) { 2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // If not holding, return 0 2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return SystemClock.elapsedRealtime() - holdingStartTime; 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 222767a662ecde33c3979bf02b793d392aca0403162Wink Saville public DisconnectCause getDisconnectCause() { 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return cause; 2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 226767a662ecde33c3979bf02b793d392aca0403162Wink Saville public boolean isIncoming() { 2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return isIncoming; 2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 230767a662ecde33c3979bf02b793d392aca0403162Wink Saville public GsmCall.State getState() { 2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (disconnected) { 232767a662ecde33c3979bf02b793d392aca0403162Wink Saville return GsmCall.State.DISCONNECTED; 233767a662ecde33c3979bf02b793d392aca0403162Wink Saville } else { 2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return super.getState(); 2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 238767a662ecde33c3979bf02b793d392aca0403162Wink Saville public void hangup() throws CallStateException { 239767a662ecde33c3979bf02b793d392aca0403162Wink Saville if (!disconnected) { 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project owner.hangup(this); 2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new CallStateException ("disconnected"); 2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 246767a662ecde33c3979bf02b793d392aca0403162Wink Saville public void separate() throws CallStateException { 247767a662ecde33c3979bf02b793d392aca0403162Wink Saville if (!disconnected) { 2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project owner.separate(this); 2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new CallStateException ("disconnected"); 2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 254767a662ecde33c3979bf02b793d392aca0403162Wink Saville public PostDialState getPostDialState() { 2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return postDialState; 2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 258767a662ecde33c3979bf02b793d392aca0403162Wink Saville public void proceedAfterWaitChar() { 2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (postDialState != PostDialState.WAIT) { 260767a662ecde33c3979bf02b793d392aca0403162Wink Saville Log.w(LOG_TAG, "GsmConnection.proceedAfterWaitChar(): Expected " 2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + "getPostDialState() to be WAIT but was " + postDialState); 2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setPostDialState(PostDialState.STARTED); 2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project processNextPostDialChar(); 2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 269767a662ecde33c3979bf02b793d392aca0403162Wink Saville 2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void proceedAfterWildChar(String str) { 2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (postDialState != PostDialState.WILD) { 272767a662ecde33c3979bf02b793d392aca0403162Wink Saville Log.w(LOG_TAG, "GsmConnection.proceedAfterWaitChar(): Expected " 2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + "getPostDialState() to be WILD but was " + postDialState); 2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setPostDialState(PostDialState.STARTED); 2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (false) { 2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean playedTone = false; 2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int len = (str != null ? str.length() : 0); 2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<len; i++) { 2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project char c = str.charAt(i); 2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Message msg = null; 2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (i == len-1) { 2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project msg = h.obtainMessage(EVENT_DTMF_DONE); 2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (PhoneNumberUtils.is12Key(c)) { 2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project owner.cm.sendDtmf(c, msg); 2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project playedTone = true; 2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!playedTone) { 2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project processNextPostDialChar(); 2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // make a new postDialString, with the wild char replacement string 3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // at the beginning, followed by the remaining postDialString. 3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project StringBuilder buf = new StringBuilder(str); 3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project buf.append(postDialString.substring(nextPostDialChar)); 3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project postDialString = buf.toString(); 3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project nextPostDialChar = 0; 3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (Phone.DEBUG_PHONE) { 309767a662ecde33c3979bf02b793d392aca0403162Wink Saville log("proceedAfterWildChar: new postDialString is " + 3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project postDialString); 3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project processNextPostDialChar(); 3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 316767a662ecde33c3979bf02b793d392aca0403162Wink Saville 317767a662ecde33c3979bf02b793d392aca0403162Wink Saville public void cancelPostDial() { 3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setPostDialState(PostDialState.CANCELLED); 3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 321767a662ecde33c3979bf02b793d392aca0403162Wink Saville /** 3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Called when this Connection is being hung up locally (eg, user pressed "end") 3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Note that at this point, the hangup request has been dispatched to the radio 324767a662ecde33c3979bf02b793d392aca0403162Wink Saville * but no response has yet been received so update() has not yet been called 3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void 327767a662ecde33c3979bf02b793d392aca0403162Wink Saville onHangupLocal() { 3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cause = DisconnectCause.LOCAL; 3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project DisconnectCause 332767a662ecde33c3979bf02b793d392aca0403162Wink Saville disconnectCauseFromCode(int causeCode) { 3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See 22.001 Annex F.4 for mapping of cause codes 3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to local tones 3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 337767a662ecde33c3979bf02b793d392aca0403162Wink Saville 3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (causeCode) { 3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case CallFailCause.USER_BUSY: 3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return DisconnectCause.BUSY; 3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case CallFailCause.NO_CIRCUIT_AVAIL: 3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case CallFailCause.TEMPORARY_FAILURE: 3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case CallFailCause.SWITCHING_CONGESTION: 3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case CallFailCause.CHANNEL_NOT_AVAIL: 3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case CallFailCause.QOS_NOT_AVAIL: 3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case CallFailCause.BEARER_NOT_AVAIL: 3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return DisconnectCause.CONGESTION; 3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case CallFailCause.ACM_LIMIT_EXCEEDED: 3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return DisconnectCause.LIMIT_EXCEEDED; 3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case CallFailCause.CALL_BARRED: 3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return DisconnectCause.CALL_BARRED; 3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case CallFailCause.FDN_BLOCKED: 3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return DisconnectCause.FDN_BLOCKED; 3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case CallFailCause.ERROR_UNSPECIFIED: 360767a662ecde33c3979bf02b793d392aca0403162Wink Saville case CallFailCause.NORMAL_CLEARING: 3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project default: 3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project GSMPhone phone = owner.phone; 3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int serviceState = phone.getServiceState().getState(); 3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (serviceState == ServiceState.STATE_POWER_OFF) { 3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return DisconnectCause.POWER_OFF; 3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (serviceState == ServiceState.STATE_OUT_OF_SERVICE 3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project || serviceState == ServiceState.STATE_EMERGENCY_ONLY ) { 3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return DisconnectCause.OUT_OF_SERVICE; 369767a662ecde33c3979bf02b793d392aca0403162Wink Saville } else if (phone.getIccCard().getState() != SimCard.State.READY) { 370767a662ecde33c3979bf02b793d392aca0403162Wink Saville return DisconnectCause.ICC_ERROR; 3714df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project } else if (causeCode == CallFailCause.ERROR_UNSPECIFIED) { 3724df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project if (phone.mSST.rs.isCsRestricted()) { 3732563a3ac05dd3cf8a07203ae682c243f2e793137Wink Saville return DisconnectCause.CS_RESTRICTED; 3744df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project } else if (phone.mSST.rs.isCsEmergencyRestricted()) { 3754df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project return DisconnectCause.CS_RESTRICTED_EMERGENCY; 3764df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project } else if (phone.mSST.rs.isCsNormalRestricted()) { 3774df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project return DisconnectCause.CS_RESTRICTED_NORMAL; 3784df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project } else { 379eafe72a0db89b5867ccd4b8170377309827785a2Satish.Kulkarni return DisconnectCause.ERROR_UNSPECIFIED; 3804df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project } 381eafe72a0db89b5867ccd4b8170377309827785a2Satish.Kulkarni } else if (causeCode == CallFailCause.NORMAL_CLEARING) { 3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return DisconnectCause.NORMAL; 383eafe72a0db89b5867ccd4b8170377309827785a2Satish.Kulkarni } else { 384eafe72a0db89b5867ccd4b8170377309827785a2Satish.Kulkarni // If nothing else matches, report unknown call drop reason 385eafe72a0db89b5867ccd4b8170377309827785a2Satish.Kulkarni // to app, not NORMAL call end. 386eafe72a0db89b5867ccd4b8170377309827785a2Satish.Kulkarni return DisconnectCause.ERROR_UNSPECIFIED; 3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /*package*/ void 392767a662ecde33c3979bf02b793d392aca0403162Wink Saville onRemoteDisconnect(int causeCode) { 3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project onDisconnect(disconnectCauseFromCode(causeCode)); 3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** Called when the radio indicates the connection has been disconnected */ 3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /*package*/ void 398767a662ecde33c3979bf02b793d392aca0403162Wink Saville onDisconnect(DisconnectCause cause) { 3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.cause = cause; 400767a662ecde33c3979bf02b793d392aca0403162Wink Saville 401767a662ecde33c3979bf02b793d392aca0403162Wink Saville if (!disconnected) { 4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project index = -1; 403767a662ecde33c3979bf02b793d392aca0403162Wink Saville 4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project disconnectTime = System.currentTimeMillis(); 4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project duration = SystemClock.elapsedRealtime() - connectTimeReal; 4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project disconnected = true; 4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (Config.LOGD) Log.d(LOG_TAG, 4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "[GSMConn] onDisconnect: cause=" + cause); 4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project owner.phone.notifyDisconnect(this); 4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (parent != null) { 414767a662ecde33c3979bf02b793d392aca0403162Wink Saville parent.connectionDisconnected(this); 4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project releaseWakeLock(); 4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Returns true if state has changed, false if nothing changed 4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /*package*/ boolean 4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project update (DriverCall dc) { 423767a662ecde33c3979bf02b793d392aca0403162Wink Saville GsmCall newParent; 4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean changed = false; 4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean wasConnectingInOrOut = isConnectingInOrOut(); 426767a662ecde33c3979bf02b793d392aca0403162Wink Saville boolean wasHolding = (getState() == GsmCall.State.HOLDING); 4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project newParent = parentFromDCState(dc.state); 4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!equalsHandlesNulls(address, dc.number)) { 4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (Phone.DEBUG_PHONE) log("update: phone # changed!"); 4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project address = dc.number; 4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project changed = true; 4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (newParent != parent) { 4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (parent != null) { 4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project parent.detach(this); 4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project newParent.attach(this, dc); 4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project parent = newParent; 4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project changed = true; 4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean parentStateChange; 4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project parentStateChange = parent.update (this, dc); 4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project changed = changed || parentStateChange; 4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** Some state-transition events */ 4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (Phone.DEBUG_PHONE) log( 4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "update: parent=" + parent + 4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ", hasNewParent=" + (newParent != parent) + 4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ", wasConnectingInOrOut=" + wasConnectingInOrOut + 4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ", wasHolding=" + wasHolding + 4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ", isConnectingInOrOut=" + isConnectingInOrOut() + 4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ", changed=" + changed); 4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (wasConnectingInOrOut && !isConnectingInOrOut()) { 4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project onConnectedInOrOut(); 4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 464767a662ecde33c3979bf02b793d392aca0403162Wink Saville if (changed && !wasHolding && (getState() == GsmCall.State.HOLDING)) { 4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // We've transitioned into HOLDING 4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project onStartedHolding(); 4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return changed; 4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Called when this Connection is in the foregroundCall 4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * when a dial is initiated. 4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * We know we're ACTIVE, and we know we're going to end up 4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * HOLDING in the backgroundCall 4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void 479767a662ecde33c3979bf02b793d392aca0403162Wink Saville fakeHoldBeforeDial() { 4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (parent != null) { 4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project parent.detach(this); 4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project parent = owner.backgroundCall; 485767a662ecde33c3979bf02b793d392aca0403162Wink Saville parent.attachFake(this, GsmCall.State.HOLDING); 4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project onStartedHolding(); 4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /*package*/ int 4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project getGSMIndex() throws CallStateException { 4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (index >= 0) { 4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return index + 1; 4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new CallStateException ("GSM index not yet assigned"); 4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * An incoming or outgoing call has connected 5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void 5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project onConnectedInOrOut() { 5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project connectTime = System.currentTimeMillis(); 5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project connectTimeReal = SystemClock.elapsedRealtime(); 5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project duration = 0; 5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // bug #678474: incoming call interpreted as missed call, even though 5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // it sounds like the user has picked up the call. 5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (Phone.DEBUG_PHONE) { 5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project log("onConnectedInOrOut: connectTime=" + connectTime); 5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!isIncoming) { 5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // outgoing calls only 5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project processNextPostDialChar(); 5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project releaseWakeLock(); 5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void 5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project onStartedHolding() { 5239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project holdingStartTime = SystemClock.elapsedRealtime(); 5249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Performs the appropriate action for a post-dial char, but does not 5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * notify application. returns false if the character is invalid and 5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * should be ignored 5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean 531767a662ecde33c3979bf02b793d392aca0403162Wink Saville processPostDialChar(char c) { 5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (PhoneNumberUtils.is12Key(c)) { 5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project owner.cm.sendDtmf(c, h.obtainMessage(EVENT_DTMF_DONE)); 5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (c == PhoneNumberUtils.PAUSE) { 5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // From TS 22.101: 5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 537767a662ecde33c3979bf02b793d392aca0403162Wink Saville // "The first occurrence of the "DTMF Control Digits Separator" 538767a662ecde33c3979bf02b793d392aca0403162Wink Saville // shall be used by the ME to distinguish between the addressing 5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // digits (i.e. the phone number) and the DTMF digits...." 5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (nextPostDialChar == 1) { 5429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // The first occurrence. 5439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // We don't need to pause here, but wait for just a bit anyway 544767a662ecde33c3979bf02b793d392aca0403162Wink Saville h.sendMessageDelayed(h.obtainMessage(EVENT_PAUSE_DONE), 5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PAUSE_DELAY_FIRST_MILLIS); 5469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 5479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // It continues... 548767a662ecde33c3979bf02b793d392aca0403162Wink Saville // "Upon subsequent occurrences of the separator, the UE shall 549767a662ecde33c3979bf02b793d392aca0403162Wink Saville // pause again for 3 seconds (\u00B1 20 %) before sending any 5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // further DTMF digits." 551767a662ecde33c3979bf02b793d392aca0403162Wink Saville h.sendMessageDelayed(h.obtainMessage(EVENT_PAUSE_DONE), 5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PAUSE_DELAY_MILLIS); 5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (c == PhoneNumberUtils.WAIT) { 5559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setPostDialState(PostDialState.WAIT); 5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (c == PhoneNumberUtils.WILD) { 5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setPostDialState(PostDialState.WILD); 5589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String 566767a662ecde33c3979bf02b793d392aca0403162Wink Saville getRemainingPostDialString() { 567767a662ecde33c3979bf02b793d392aca0403162Wink Saville if (postDialState == PostDialState.CANCELLED 5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project || postDialState == PostDialState.COMPLETE 5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project || postDialString == null 5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project || postDialString.length() <= nextPostDialChar 5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ) { 5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return ""; 5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return postDialString.substring(nextPostDialChar); 5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5772563a3ac05dd3cf8a07203ae682c243f2e793137Wink Saville 5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void finalize() 5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * It is understood that This finializer is not guaranteed 5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to be called and the release lock call is here just in 5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * case there is some path that doesn't call onDisconnect 5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * and or onConnectedInOrOut. 5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mPartialWakeLock.isHeld()) { 5889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.e(LOG_TAG, "[GSMConn] UNEXPECTED; mPartialWakeLock is held when finalizing."); 5899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project releaseWakeLock(); 5919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void 594767a662ecde33c3979bf02b793d392aca0403162Wink Saville processNextPostDialChar() { 5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project char c = 0; 5969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Registrant postDialHandler; 5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (postDialState == PostDialState.CANCELLED) { 5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //Log.v("GSM", "##### processNextPostDialChar: postDialState == CANCELLED, bail"); 6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (postDialString == null || 6049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project postDialString.length() <= nextPostDialChar) { 6059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setPostDialState(PostDialState.COMPLETE); 6069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // notifyMessage.arg1 is 0 on complete 6089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project c = 0; 6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean isValid; 6112563a3ac05dd3cf8a07203ae682c243f2e793137Wink Saville 6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setPostDialState(PostDialState.STARTED); 6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project c = postDialString.charAt(nextPostDialChar++); 6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project isValid = processPostDialChar(c); 6179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!isValid) { 6199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Will call processNextPostDialChar 6209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project h.obtainMessage(EVENT_NEXT_POST_DIAL).sendToTarget(); 6219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Don't notify application 6229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.e("GSM", "processNextPostDialChar: c=" + c + " isn't valid!"); 6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project postDialHandler = owner.phone.mPostDialHandler; 6289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Message notifyMessage; 6309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 631767a662ecde33c3979bf02b793d392aca0403162Wink Saville if (postDialHandler != null 632767a662ecde33c3979bf02b793d392aca0403162Wink Saville && (notifyMessage = postDialHandler.messageForRegistrant()) != null) { 6339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // The AsyncResult.result is the Connection object 6349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PostDialState state = postDialState; 6359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AsyncResult ar = AsyncResult.forMessage(notifyMessage); 6369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ar.result = this; 6379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ar.userObj = state; 6389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // arg1 is the character that was/is being processed 6409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project notifyMessage.arg1 = c; 6419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //Log.v("GSM", "##### processNextPostDialChar: send msg to postDialHandler, arg1=" + c); 6439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project notifyMessage.sendToTarget(); 6449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** "connecting" means "has never been ACTIVE" for both incoming 6499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * and outgoing calls 6509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean 652767a662ecde33c3979bf02b793d392aca0403162Wink Saville isConnectingInOrOut() { 653767a662ecde33c3979bf02b793d392aca0403162Wink Saville return parent == null || parent == owner.ringingCall 654767a662ecde33c3979bf02b793d392aca0403162Wink Saville || parent.state == GsmCall.State.DIALING 655767a662ecde33c3979bf02b793d392aca0403162Wink Saville || parent.state == GsmCall.State.ALERTING; 6569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 658767a662ecde33c3979bf02b793d392aca0403162Wink Saville private GsmCall 659767a662ecde33c3979bf02b793d392aca0403162Wink Saville parentFromDCState (DriverCall.State state) { 6609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (state) { 6619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case ACTIVE: 6629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case DIALING: 6639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case ALERTING: 6649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return owner.foregroundCall; 6659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //break; 6669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case HOLDING: 6689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return owner.backgroundCall; 6699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //break; 6709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case INCOMING: 6729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case WAITING: 6739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return owner.ringingCall; 6749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //break; 6759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project default: 6779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new RuntimeException("illegal call state: " + state); 6789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6822563a3ac05dd3cf8a07203ae682c243f2e793137Wink Saville * Set post dial state and acquire wake lock while switching to "started" 6832563a3ac05dd3cf8a07203ae682c243f2e793137Wink Saville * state, the wake lock will be released if state switches out of "started" 6842563a3ac05dd3cf8a07203ae682c243f2e793137Wink Saville * state or after WAKE_LOCK_TIMEOUT_MILLIS. 6859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param s new PostDialState 6869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void setPostDialState(PostDialState s) { 6882563a3ac05dd3cf8a07203ae682c243f2e793137Wink Saville if (postDialState != PostDialState.STARTED 6899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && s == PostDialState.STARTED) { 6909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project acquireWakeLock(); 6919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Message msg = h.obtainMessage(EVENT_WAKE_LOCK_TIMEOUT); 6929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project h.sendMessageDelayed(msg, WAKE_LOCK_TIMEOUT_MILLIS); 6932563a3ac05dd3cf8a07203ae682c243f2e793137Wink Saville } else if (postDialState == PostDialState.STARTED 6949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && s != PostDialState.STARTED) { 6959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project h.removeMessages(EVENT_WAKE_LOCK_TIMEOUT); 6969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project releaseWakeLock(); 6979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project postDialState = s; 6999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7002563a3ac05dd3cf8a07203ae682c243f2e793137Wink Saville 7019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void 7029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project createWakeLock(Context context) { 7039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE); 7049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPartialWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, LOG_TAG); 7059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7062563a3ac05dd3cf8a07203ae682c243f2e793137Wink Saville 7079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void 7089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project acquireWakeLock() { 7099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project log("acquireWakeLock"); 7109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPartialWakeLock.acquire(); 7119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void 7149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project releaseWakeLock() { 7159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized(mPartialWakeLock) { 7169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mPartialWakeLock.isHeld()) { 7179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project log("releaseWakeLock"); 7189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPartialWakeLock.release(); 7199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7222563a3ac05dd3cf8a07203ae682c243f2e793137Wink Saville 7239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void log(String msg) { 7249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.d(LOG_TAG, "[GSMConn] " + msg); 7259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 726105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 727105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project @Override 728105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project public int getNumberPresentation() { 729105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project return numberPresentation; 730105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 7319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 732