GsmCdmaCall.java revision 0825495a331bb44df395a0cdb79fab85e68db5d5
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.cdma; 180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 190825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport java.util.ArrayList; 200825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport java.util.List; 210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 220825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.telephony.Call; 230825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.telephony.CallStateException; 240825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.telephony.Connection; 250825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.telephony.DriverCall; 260825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.telephony.Phone; 270825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.telephony.Call.State; 280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville/** 300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * {@hide} 310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 320825495a331bb44df395a0cdb79fab85e68db5d5Wink Savillepublic final class CdmaCall extends Call { 330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /*************************** Instance Variables **************************/ 340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /*package*/ ArrayList<Connection> connections = new ArrayList<Connection>(); 360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /*package*/ State state = State.IDLE; 370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /*package*/ CdmaCallTracker owner; 380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /***************************** Class Methods *****************************/ 400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville static State 420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville stateFromDCState (DriverCall.State dcState) { 430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville switch (dcState) { 440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case ACTIVE: return State.ACTIVE; 450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case HOLDING: return State.HOLDING; 460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case DIALING: return State.DIALING; 470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case ALERTING: return State.ALERTING; 480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case INCOMING: return State.INCOMING; 490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case WAITING: return State.WAITING; 500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville default: throw new RuntimeException ("illegal call state:" + dcState); 510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /****************************** Constructors *****************************/ 560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /*package*/ 570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville CdmaCall (CdmaCallTracker owner) { 580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville this.owner = owner; 590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public void dispose() { 620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /************************** Overridden from Call *************************/ 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 State 720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville getState() { 730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return state; 740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public Phone 770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville getPhone() { 780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return owner.phone; 790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public boolean isMultiparty() { 820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return connections.size() > 1; 830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** Please note: if this is the foreground call and a 860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * background call exists, the background call will be resumed 870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * because an AT+CHLD=1 will be sent 880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public void 900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville hangup() throws CallStateException { 910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville owner.hangup(this); 920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public String 950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville toString() { 960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return state.toString(); 970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville //***** Called from CdmaConnection 1000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /*package*/ void 1020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville attach(Connection conn, DriverCall dc) { 1030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville connections.add(conn); 1040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville state = stateFromDCState (dc.state); 1060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /*package*/ void 1090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville attachFake(Connection conn, State state) { 1100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville connections.add(conn); 1110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville this.state = state; 1130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 1160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Called by CdmaConnection when it has disconnected 1170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 1180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville void 1190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville connectionDisconnected(CdmaConnection conn) { 1200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (state != State.DISCONNECTED) { 1210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /* If only disconnected connections remain, we are disconnected*/ 1220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville boolean hasOnlyDisconnectedConnections = true; 1240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville for (int i = 0, s = connections.size() ; i < s; i ++) { 1260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (connections.get(i).getState() 1270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville != State.DISCONNECTED 1280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ) { 1290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville hasOnlyDisconnectedConnections = false; 1300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 1310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (hasOnlyDisconnectedConnections) { 1350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville state = State.DISCONNECTED; 1360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /*package*/ void 1420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville detach(CdmaConnection conn) { 1430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville connections.remove(conn); 1440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (connections.size() == 0) { 1460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville state = State.IDLE; 1470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /*package*/ boolean 1510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville update (CdmaConnection conn, DriverCall dc) { 1520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville State newState; 1530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville boolean changed = false; 1540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville newState = stateFromDCState(dc.state); 1560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (newState != state) { 1580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville state = newState; 1590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville changed = true; 1600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return changed; 1630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 1660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @return true if there's no space in this call for additional 1670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * connections to be added via "conference" 1680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 1690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /*package*/ boolean 1700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville isFull() { 1710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return connections.size() == CdmaCallTracker.MAX_CONNECTIONS_PER_CALL; 1720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville //***** Called from CdmaCallTracker 1750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 1780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Called when this Call is being hung up locally (eg, user pressed "end") 1790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Note that at this point, the hangup request has been dispatched to the radio 1800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * but no response has yet been received so update() has not yet been called 1810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 1820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville void 1830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville onHangupLocal() { 1840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville for (int i = 0, s = connections.size(); i < s; i++) { 1850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville CdmaConnection cn = (CdmaConnection)connections.get(i); 1860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville cn.onHangupLocal(); 1880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville state = State.DISCONNECTING; 1900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 1930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Called when it's time to clean up disconnected Connection objects 1940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 1950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville void clearDisconnected() { 1960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville for (int i = connections.size() - 1 ; i >= 0 ; i--) { 1970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville CdmaConnection cn = (CdmaConnection)connections.get(i); 1980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (cn.getState() == State.DISCONNECTED) { 2000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville connections.remove(i); 2010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 2020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 2030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (connections.size() == 0) { 2050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville state = State.IDLE; 2060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 2070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 2080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville} 209