GsmCdmaCall.java revision 1220a4e283def0598468376cf112d3b904026fb8
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.List; 200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 210825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.telephony.Call; 220825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.telephony.CallStateException; 230825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.telephony.Connection; 240825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.telephony.DriverCall; 250825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.telephony.Phone; 260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville/** 280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * {@hide} 290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 300825495a331bb44df395a0cdb79fab85e68db5d5Wink Savillepublic final class CdmaCall extends Call { 310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /*************************** Instance Variables **************************/ 320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 3322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville /*package*/ CdmaCallTracker mOwner; 340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /***************************** Class Methods *****************************/ 360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville static State 380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville stateFromDCState (DriverCall.State dcState) { 390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville switch (dcState) { 400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case ACTIVE: return State.ACTIVE; 410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case HOLDING: return State.HOLDING; 420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case DIALING: return State.DIALING; 430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case ALERTING: return State.ALERTING; 440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case INCOMING: return State.INCOMING; 450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case WAITING: return State.WAITING; 460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville default: throw new RuntimeException ("illegal call state:" + dcState); 470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /****************************** Constructors *****************************/ 520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /*package*/ 530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville CdmaCall (CdmaCallTracker owner) { 5422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mOwner = owner; 550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public void dispose() { 580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /************************** Overridden from Call *************************/ 61cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public List<Connection> 630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville getConnections() { 640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // FIXME should return Collections.unmodifiableList(); 6522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville return mConnections; 660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 68cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public Phone 700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville getPhone() { 7122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville return mOwner.mPhone; 720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 74cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public boolean isMultiparty() { 7622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville return mConnections.size() > 1; 770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** Please note: if this is the foreground call and a 800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * background call exists, the background call will be resumed 810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * because an AT+CHLD=1 will be sent 820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 83cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public void 850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville hangup() throws CallStateException { 8622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mOwner.hangup(this); 870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 89cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public String 910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville toString() { 9222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville return mState.toString(); 930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville //***** Called from CdmaConnection 960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /*package*/ void 980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville attach(Connection conn, DriverCall dc) { 9922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mConnections.add(conn); 1000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 10122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mState = stateFromDCState (dc.state); 1020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /*package*/ void 1050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville attachFake(Connection conn, State state) { 10622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mConnections.add(conn); 1070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 10822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mState = state; 1090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 1120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Called by CdmaConnection when it has disconnected 1130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 1141220a4e283def0598468376cf112d3b904026fb8Danny Baumann boolean 1150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville connectionDisconnected(CdmaConnection conn) { 11622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (mState != State.DISCONNECTED) { 1170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /* If only disconnected connections remain, we are disconnected*/ 1180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville boolean hasOnlyDisconnectedConnections = true; 1200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 12122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville for (int i = 0, s = mConnections.size() ; i < s; i ++) { 12222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (mConnections.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) { 13122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mState = State.DISCONNECTED; 1321220a4e283def0598468376cf112d3b904026fb8Danny Baumann return true; 1330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1351220a4e283def0598468376cf112d3b904026fb8Danny Baumann 1361220a4e283def0598468376cf112d3b904026fb8Danny Baumann return false; 1370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /*package*/ void 1410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville detach(CdmaConnection conn) { 14222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mConnections.remove(conn); 1430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 14422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (mConnections.size() == 0) { 14522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mState = State.IDLE; 1460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /*package*/ boolean 1500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville update (CdmaConnection conn, DriverCall dc) { 1510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville State newState; 1520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville boolean changed = false; 1530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville newState = stateFromDCState(dc.state); 1550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 15622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (newState != mState) { 15722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mState = newState; 1580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville changed = true; 1590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return changed; 1620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 1650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @return true if there's no space in this call for additional 1660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * connections to be added via "conference" 1670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 1680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /*package*/ boolean 1690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville isFull() { 17022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville return mConnections.size() == CdmaCallTracker.MAX_CONNECTIONS_PER_CALL; 1710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville //***** Called from CdmaCallTracker 1740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 1770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Called when this Call is being hung up locally (eg, user pressed "end") 1780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Note that at this point, the hangup request has been dispatched to the radio 1790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * but no response has yet been received so update() has not yet been called 1800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 1810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville void 1820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville onHangupLocal() { 18322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville for (int i = 0, s = mConnections.size(); i < s; i++) { 18422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville CdmaConnection cn = (CdmaConnection)mConnections.get(i); 1850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville cn.onHangupLocal(); 1870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 18822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mState = State.DISCONNECTING; 1890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 1920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Called when it's time to clean up disconnected Connection objects 1930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 1940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville void clearDisconnected() { 19522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville for (int i = mConnections.size() - 1 ; i >= 0 ; i--) { 19622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville CdmaConnection cn = (CdmaConnection)mConnections.get(i); 1970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (cn.getState() == State.DISCONNECTED) { 19922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mConnections.remove(i); 2000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 2010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 2020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 20322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (mConnections.size() == 0) { 20422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mState = State.IDLE; 2050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 2060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 2070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville} 208