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.List; 260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville/** 280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * {@hide} 290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 300825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleclass GsmCall extends Call { 310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /*************************** Instance Variables **************************/ 320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 3322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville /*package*/ GsmCallTracker mOwner; 340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /***************************** Class Methods *****************************/ 370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville static State 390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville stateFromDCState (DriverCall.State dcState) { 400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville switch (dcState) { 410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case ACTIVE: return State.ACTIVE; 420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case HOLDING: return State.HOLDING; 430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case DIALING: return State.DIALING; 440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case ALERTING: return State.ALERTING; 450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case INCOMING: return State.INCOMING; 460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case WAITING: return State.WAITING; 470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville default: throw new RuntimeException ("illegal call state:" + dcState); 480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /****************************** Constructors *****************************/ 530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /*package*/ 540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville GsmCall (GsmCallTracker owner) { 5522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mOwner = owner; 560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public void dispose() { 590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /************************** Overridden from Call *************************/ 620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 63cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public List<Connection> 650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville getConnections() { 660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // FIXME should return Collections.unmodifiableList(); 6722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville return mConnections; 680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 70cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public Phone 720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville getPhone() { 7322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville return mOwner.mPhone; 740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 76cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public boolean 780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville isMultiparty() { 7922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville return mConnections.size() > 1; 800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** Please note: if this is the foreground call and a 830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * background call exists, the background call will be resumed 840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * because an AT+CHLD=1 will be sent 850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 86cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public void 880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville hangup() throws CallStateException { 8922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mOwner.hangup(this); 900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 92cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public String 940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville toString() { 9522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville return mState.toString(); 960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville //***** Called from GsmConnection 990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /*package*/ void 1010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville attach(Connection conn, DriverCall dc) { 10222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mConnections.add(conn); 1030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 10422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mState = stateFromDCState (dc.state); 1050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /*package*/ void 1080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville attachFake(Connection conn, State state) { 10922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mConnections.add(conn); 1100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 11122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mState = state; 1120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 1150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Called by GsmConnection when it has disconnected 1160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 117368e873b65e60268521b3c74110a9b2abe8086acDanny Baumann boolean 1180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville connectionDisconnected(GsmConnection conn) { 11922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (mState != State.DISCONNECTED) { 1200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /* If only disconnected connections remain, we are disconnected*/ 1210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville boolean hasOnlyDisconnectedConnections = true; 1230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 12422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville for (int i = 0, s = mConnections.size() ; i < s; i ++) { 12522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (mConnections.get(i).getState() 1260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville != State.DISCONNECTED 1270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ) { 1280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville hasOnlyDisconnectedConnections = false; 1290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 1300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (hasOnlyDisconnectedConnections) { 13422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mState = State.DISCONNECTED; 135368e873b65e60268521b3c74110a9b2abe8086acDanny Baumann return true; 1360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 139368e873b65e60268521b3c74110a9b2abe8086acDanny Baumann return false; 140368e873b65e60268521b3c74110a9b2abe8086acDanny Baumann } 1410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /*package*/ void 1430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville detach(GsmConnection conn) { 14422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mConnections.remove(conn); 1450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 14622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (mConnections.size() == 0) { 14722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mState = State.IDLE; 1480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /*package*/ boolean 1520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville update (GsmConnection conn, DriverCall dc) { 1530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville State newState; 1540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville boolean changed = false; 1550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville newState = stateFromDCState(dc.state); 1570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 15822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (newState != mState) { 15922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mState = newState; 1600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville changed = true; 1610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return changed; 1640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 1670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @return true if there's no space in this call for additional 1680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * connections to be added via "conference" 1690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 1700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /*package*/ boolean 1710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville isFull() { 17222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville return mConnections.size() == GsmCallTracker.MAX_CONNECTIONS_PER_CALL; 1730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville //***** Called from GsmCallTracker 1760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 1790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Called when this Call is being hung up locally (eg, user pressed "end") 1800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Note that at this point, the hangup request has been dispatched to the radio 1810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * but no response has yet been received so update() has not yet been called 1820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 1830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville void 1840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville onHangupLocal() { 18522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville for (int i = 0, s = mConnections.size() 1860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ; i < s; i++ 1870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ) { 18822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville GsmConnection cn = (GsmConnection)mConnections.get(i); 1890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville cn.onHangupLocal(); 1910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 19222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mState = State.DISCONNECTING; 1930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 1960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Called when it's time to clean up disconnected Connection objects 1970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 1980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville void 1990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville clearDisconnected() { 20022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville for (int i = mConnections.size() - 1 ; i >= 0 ; i--) { 20122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville GsmConnection cn = (GsmConnection)mConnections.get(i); 2020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (cn.getState() == State.DISCONNECTED) { 20422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mConnections.remove(i); 2050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 2060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 2070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 20822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (mConnections.size() == 0) { 20922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mState = State.IDLE; 2100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 2110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 2120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville} 2130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 214