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 /****************************** Constructors *****************************/ 360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /*package*/ 370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville GsmCall (GsmCallTracker owner) { 3822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mOwner = owner; 390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public void dispose() { 420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /************************** Overridden from Call *************************/ 450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 46cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public List<Connection> 480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville getConnections() { 490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // FIXME should return Collections.unmodifiableList(); 5022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville return mConnections; 510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 53cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public Phone 550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville getPhone() { 5622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville return mOwner.mPhone; 570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 59cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public boolean 610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville isMultiparty() { 6222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville return mConnections.size() > 1; 630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** Please note: if this is the foreground call and a 660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * background call exists, the background call will be resumed 670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * because an AT+CHLD=1 will be sent 680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 69cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public void 710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville hangup() throws CallStateException { 7222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mOwner.hangup(this); 730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 75cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public String 770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville toString() { 7822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville return mState.toString(); 790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville //***** Called from GsmConnection 820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /*package*/ void 840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville attach(Connection conn, DriverCall dc) { 8522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mConnections.add(conn); 860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 8722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mState = stateFromDCState (dc.state); 880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /*package*/ void 910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville attachFake(Connection conn, State state) { 9222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mConnections.add(conn); 930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 9422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mState = state; 950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Called by GsmConnection when it has disconnected 990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 1001220a4e283def0598468376cf112d3b904026fb8Danny Baumann boolean 1010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville connectionDisconnected(GsmConnection conn) { 10222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (mState != State.DISCONNECTED) { 1030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /* If only disconnected connections remain, we are disconnected*/ 1040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville boolean hasOnlyDisconnectedConnections = true; 1060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 10722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville for (int i = 0, s = mConnections.size() ; i < s; i ++) { 10822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (mConnections.get(i).getState() 1090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville != State.DISCONNECTED 1100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ) { 1110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville hasOnlyDisconnectedConnections = false; 1120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 1130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (hasOnlyDisconnectedConnections) { 11722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mState = State.DISCONNECTED; 1181220a4e283def0598468376cf112d3b904026fb8Danny Baumann return true; 1190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1221220a4e283def0598468376cf112d3b904026fb8Danny Baumann return false; 1231220a4e283def0598468376cf112d3b904026fb8Danny Baumann } 1240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /*package*/ void 1260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville detach(GsmConnection conn) { 12722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mConnections.remove(conn); 1280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 12922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (mConnections.size() == 0) { 13022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mState = State.IDLE; 1310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /*package*/ boolean 1350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville update (GsmConnection conn, DriverCall dc) { 1360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville State newState; 1370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville boolean changed = false; 1380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville newState = stateFromDCState(dc.state); 1400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 14122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (newState != mState) { 14222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mState = newState; 1430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville changed = true; 1440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return changed; 1470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 1500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @return true if there's no space in this call for additional 1510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * connections to be added via "conference" 1520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 1530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /*package*/ boolean 1540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville isFull() { 15522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville return mConnections.size() == GsmCallTracker.MAX_CONNECTIONS_PER_CALL; 1560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville //***** Called from GsmCallTracker 1590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 1620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Called when this Call is being hung up locally (eg, user pressed "end") 1630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Note that at this point, the hangup request has been dispatched to the radio 1640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * but no response has yet been received so update() has not yet been called 1650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 1660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville void 1670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville onHangupLocal() { 16822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville for (int i = 0, s = mConnections.size() 1690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ; i < s; i++ 1700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ) { 17122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville GsmConnection cn = (GsmConnection)mConnections.get(i); 1720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville cn.onHangupLocal(); 1740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 17522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mState = State.DISCONNECTING; 1760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 1790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Called when it's time to clean up disconnected Connection objects 1800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 1810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville void 1820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville clearDisconnected() { 18322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville for (int i = mConnections.size() - 1 ; i >= 0 ; i--) { 18422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville GsmConnection cn = (GsmConnection)mConnections.get(i); 1850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (cn.getState() == State.DISCONNECTED) { 18722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mConnections.remove(i); 1880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 19122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (mConnections.size() == 0) { 19222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mState = State.IDLE; 1930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville} 1960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 197