10825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville/* 20825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Copyright (C) 2006 The Android Open Source Project 30825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 40825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Licensed under the Apache License, Version 2.0 (the "License"); 50825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * you may not use this file except in compliance with the License. 60825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * You may obtain a copy of the License at 70825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 80825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * http://www.apache.org/licenses/LICENSE-2.0 90825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Unless required by applicable law or agreed to in writing, software 110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * distributed under the License is distributed on an "AS IS" BASIS, 120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * See the License for the specific language governing permissions and 140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * limitations under the License. 150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 170825495a331bb44df395a0cdb79fab85e68db5d5Wink Savillepackage com.android.internal.telephony.gsm; 180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 190825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.telephony.Call; 200825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.telephony.CallStateException; 210825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.telephony.Connection; 220825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.telephony.DriverCall; 230825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.telephony.Phone; 240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 250825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport java.util.ArrayList; 260825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport java.util.List; 270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville/** 290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * {@hide} 300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 310825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleclass GsmCall extends Call { 320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /*************************** Instance Variables **************************/ 330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /*package*/ ArrayList<Connection> connections = new ArrayList<Connection>(); 350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /*package*/ GsmCallTracker owner; 360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /***************************** Class Methods *****************************/ 390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville static State 410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville stateFromDCState (DriverCall.State dcState) { 420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville switch (dcState) { 430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case ACTIVE: return State.ACTIVE; 440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case HOLDING: return State.HOLDING; 450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case DIALING: return State.DIALING; 460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case ALERTING: return State.ALERTING; 470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case INCOMING: return State.INCOMING; 480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case WAITING: return State.WAITING; 490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville default: throw new RuntimeException ("illegal call state:" + dcState); 500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /****************************** Constructors *****************************/ 550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /*package*/ 560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville GsmCall (GsmCallTracker owner) { 570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville this.owner = owner; 580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public void dispose() { 610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /************************** Overridden from Call *************************/ 640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public List<Connection> 660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville getConnections() { 670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // FIXME should return Collections.unmodifiableList(); 680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return connections; 690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public Phone 720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville getPhone() { 730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return owner.phone; 740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public boolean 770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville isMultiparty() { 780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return connections.size() > 1; 790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** Please note: if this is the foreground call and a 820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * background call exists, the background call will be resumed 830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * because an AT+CHLD=1 will be sent 840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public void 860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville hangup() throws CallStateException { 870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville owner.hangup(this); 880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public String 910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville toString() { 920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return state.toString(); 930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville //***** Called from GsmConnection 960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /*package*/ void 980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville attach(Connection conn, DriverCall dc) { 990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville connections.add(conn); 1000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville state = stateFromDCState (dc.state); 1020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /*package*/ void 1050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville attachFake(Connection conn, State state) { 1060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville connections.add(conn); 1070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville this.state = state; 1090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 1120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Called by GsmConnection when it has disconnected 1130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 1140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville void 1150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville connectionDisconnected(GsmConnection conn) { 1160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (state != State.DISCONNECTED) { 1170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /* If only disconnected connections remain, we are disconnected*/ 1180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville boolean hasOnlyDisconnectedConnections = true; 1200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville for (int i = 0, s = connections.size() ; i < s; i ++) { 1220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (connections.get(i).getState() 1230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville != State.DISCONNECTED 1240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ) { 1250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville hasOnlyDisconnectedConnections = false; 1260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 1270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (hasOnlyDisconnectedConnections) { 1310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville state = State.DISCONNECTED; 1320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /*package*/ void 1380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville detach(GsmConnection conn) { 1390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville connections.remove(conn); 1400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (connections.size() == 0) { 1420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville state = State.IDLE; 1430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /*package*/ boolean 1470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville update (GsmConnection conn, DriverCall dc) { 1480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville State newState; 1490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville boolean changed = false; 1500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville newState = stateFromDCState(dc.state); 1520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (newState != state) { 1540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville state = newState; 1550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville changed = true; 1560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return changed; 1590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 1620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @return true if there's no space in this call for additional 1630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * connections to be added via "conference" 1640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 1650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /*package*/ boolean 1660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville isFull() { 1670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return connections.size() == GsmCallTracker.MAX_CONNECTIONS_PER_CALL; 1680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville //***** Called from GsmCallTracker 1710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 1740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Called when this Call is being hung up locally (eg, user pressed "end") 1750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Note that at this point, the hangup request has been dispatched to the radio 1760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * but no response has yet been received so update() has not yet been called 1770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 1780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville void 1790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville onHangupLocal() { 1800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville for (int i = 0, s = connections.size() 1810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ; i < s; i++ 1820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ) { 1830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville GsmConnection cn = (GsmConnection)connections.get(i); 1840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville cn.onHangupLocal(); 1860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville state = State.DISCONNECTING; 1880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 1910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Called when it's time to clean up disconnected Connection objects 1920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 1930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville void 1940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville clearDisconnected() { 1950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville for (int i = connections.size() - 1 ; i >= 0 ; i--) { 1960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville GsmConnection cn = (GsmConnection)connections.get(i); 1970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (cn.getState() == State.DISCONNECTED) { 1990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville connections.remove(i); 2000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 2010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 2020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (connections.size() == 0) { 2040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville state = State.IDLE; 2050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 2060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 2070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville} 2080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 209