GsmCall.java revision 9066cfe9886ac131c34d59ed0e2d287b0e3c0087
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 com.android.internal.telephony.*; 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.ArrayList; 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.List; 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@hide} 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass GSMCall extends Call 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /*************************** Instance Variables **************************/ 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /*package*/ ArrayList<Connection> connections = new ArrayList<Connection>(); 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /*package*/ State state = State.IDLE; 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /*package*/ CallTracker owner; 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /***************************** Class Methods *****************************/ 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static State 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project stateFromDCState (DriverCall.State dcState) 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (dcState) { 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case ACTIVE: return State.ACTIVE; 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case HOLDING: return State.HOLDING; 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case DIALING: return State.DIALING; 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case ALERTING: return State.ALERTING; 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case INCOMING: return State.INCOMING; 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case WAITING: return State.WAITING; 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project default: throw new RuntimeException ("illegal call state:" + dcState); 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /****************************** Constructors *****************************/ 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /*package*/ 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project GSMCall (CallTracker owner) 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.owner = owner; 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /************************** Overridden from Call *************************/ 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public List<Connection> 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project getConnections() 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // FIXME should return Collections.unmodifiableList(); 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return connections; 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public State 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project getState() 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return state; 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Phone 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project getPhone() 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //TODO 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project isMultiparty() 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return connections.size() > 1; 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** Please note: if this is the foreground call and a 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * background call exists, the background call will be resumed 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * because an AT+CHLD=1 will be sent 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project hangup() throws CallStateException 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project owner.hangup(this); 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project toString() 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return state.toString(); 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //***** Called from GSMConnection 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /*package*/ void 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project attach(GSMConnection conn, DriverCall dc) 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project connections.add(conn); 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project state = stateFromDCState (dc.state); 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /*package*/ void 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project attachFake(GSMConnection conn, State state) 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project connections.add(conn); 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.state = state; 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Called by GSMConnection when it has disconnected 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project connectionDisconnected(GSMConnection conn) 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (state != State.DISCONNECTED) { 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* If only disconnected connections remain, we are disconnected*/ 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean hasOnlyDisconnectedConnections = true; 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0, s = connections.size() ; i < s; i ++) { 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (connections.get(i).getState() 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project != State.DISCONNECTED 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ) { 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project hasOnlyDisconnectedConnections = false; 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (hasOnlyDisconnectedConnections) { 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project state = State.DISCONNECTED; 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /*package*/ void 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project detach(GSMConnection conn) 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project connections.remove(conn); 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (connections.size() == 0) { 1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project state = State.IDLE; 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /*package*/ boolean 1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project update (GSMConnection conn, DriverCall dc) 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project State newState; 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean changed = false; 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project newState = stateFromDCState(dc.state); 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (newState != state) { 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project state = newState; 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project changed = true; 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return changed; 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return true if there's no space in this call for additional 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * connections to be added via "conference" 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /*package*/ boolean 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project isFull() 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return connections.size() == CallTracker.MAX_CONNECTIONS_PER_CALL; 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //***** Called from CallTracker 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Called when this Call is being hung up locally (eg, user pressed "end") 1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Note that at this point, the hangup request has been dispatched to the radio 1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * but no response has yet been received so update() has not yet been called 1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project onHangupLocal() 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0, s = connections.size() 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ; i < s; i++ 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ) { 1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project GSMConnection cn = (GSMConnection)connections.get(i); 1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cn.onHangupLocal(); 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Called when it's time to clean up disconnected Connection objects 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void 2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project clearDisconnected() 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = connections.size() - 1 ; i >= 0 ; i--) { 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project GSMConnection cn = (GSMConnection)connections.get(i); 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (cn.getState() == State.DISCONNECTED) { 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project connections.remove(i); 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (connections.size() == 0) { 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project state = State.IDLE; 2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 222