10825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville/* 23a96b0ee1d152549279c58ba24a0a035cc9a557bAmit Mahajan * Copyright (C) 2015 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 173a96b0ee1d152549279c58ba24a0a035cc9a557bAmit Mahajanpackage com.android.internal.telephony; 180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 193a96b0ee1d152549279c58ba24a0a035cc9a557bAmit Mahajanimport java.util.List; 203a96b0ee1d152549279c58ba24a0a035cc9a557bAmit Mahajan 210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville/** 220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * {@hide} 230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 243a96b0ee1d152549279c58ba24a0a035cc9a557bAmit Mahajanpublic class GsmCdmaCall extends Call { 250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /*************************** Instance Variables **************************/ 260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 273a96b0ee1d152549279c58ba24a0a035cc9a557bAmit Mahajan /*package*/ GsmCdmaCallTracker mOwner; 280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /****************************** Constructors *****************************/ 300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /*package*/ 31e5468b6b0242c072d0b7eea7e6c75a536cb650dfAmit Mahajan public GsmCdmaCall (GsmCdmaCallTracker owner) { 3222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mOwner = owner; 330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /************************** Overridden from Call *************************/ 363a96b0ee1d152549279c58ba24a0a035cc9a557bAmit Mahajan 37cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 383a96b0ee1d152549279c58ba24a0a035cc9a557bAmit Mahajan public List<Connection> getConnections() { 390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // FIXME should return Collections.unmodifiableList(); 4022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville return mConnections; 410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 43cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 443a96b0ee1d152549279c58ba24a0a035cc9a557bAmit Mahajan public Phone getPhone() { 45e5468b6b0242c072d0b7eea7e6c75a536cb650dfAmit Mahajan return mOwner.getPhone(); 460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 48cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public boolean isMultiparty() { 5022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville return mConnections.size() > 1; 510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** Please note: if this is the foreground call and a 540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * background call exists, the background call will be resumed 550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * because an AT+CHLD=1 will be sent 560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 57cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 583a96b0ee1d152549279c58ba24a0a035cc9a557bAmit Mahajan public void hangup() throws CallStateException { 5922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mOwner.hangup(this); 600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 62cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 633a96b0ee1d152549279c58ba24a0a035cc9a557bAmit Mahajan public String toString() { 6422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville return mState.toString(); 650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 673a96b0ee1d152549279c58ba24a0a035cc9a557bAmit Mahajan //***** Called from GsmCdmaConnection 680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 69e5468b6b0242c072d0b7eea7e6c75a536cb650dfAmit Mahajan public void attach(Connection conn, DriverCall dc) { 7022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mConnections.add(conn); 710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 7222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mState = stateFromDCState (dc.state); 730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 75e5468b6b0242c072d0b7eea7e6c75a536cb650dfAmit Mahajan public void attachFake(Connection conn, State state) { 7622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mConnections.add(conn); 770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 7822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mState = state; 790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 823a96b0ee1d152549279c58ba24a0a035cc9a557bAmit Mahajan * Called by GsmCdmaConnection when it has disconnected 830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 84e5468b6b0242c072d0b7eea7e6c75a536cb650dfAmit Mahajan public boolean connectionDisconnected(GsmCdmaConnection conn) { 8522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (mState != State.DISCONNECTED) { 860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /* If only disconnected connections remain, we are disconnected*/ 870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville boolean hasOnlyDisconnectedConnections = true; 890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 903a96b0ee1d152549279c58ba24a0a035cc9a557bAmit Mahajan for (int i = 0, s = mConnections.size(); i < s; i ++) { 913a96b0ee1d152549279c58ba24a0a035cc9a557bAmit Mahajan if (mConnections.get(i).getState() != State.DISCONNECTED) { 920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville hasOnlyDisconnectedConnections = false; 930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (hasOnlyDisconnectedConnections) { 9822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mState = State.DISCONNECTED; 991220a4e283def0598468376cf112d3b904026fb8Danny Baumann return true; 1000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1021220a4e283def0598468376cf112d3b904026fb8Danny Baumann 1031220a4e283def0598468376cf112d3b904026fb8Danny Baumann return false; 1040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 106e5468b6b0242c072d0b7eea7e6c75a536cb650dfAmit Mahajan public void detach(GsmCdmaConnection conn) { 10722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mConnections.remove(conn); 1080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 10922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (mConnections.size() == 0) { 11022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mState = State.IDLE; 1110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1143a96b0ee1d152549279c58ba24a0a035cc9a557bAmit Mahajan /*package*/ boolean update (GsmCdmaConnection conn, DriverCall dc) { 1150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville State newState; 1160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville boolean changed = false; 1170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville newState = stateFromDCState(dc.state); 1190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 12022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (newState != mState) { 12122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mState = newState; 1220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville changed = true; 1230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return changed; 1260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 1290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @return true if there's no space in this call for additional 1300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * connections to be added via "conference" 1310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 1323a96b0ee1d152549279c58ba24a0a035cc9a557bAmit Mahajan /*package*/ boolean isFull() { 1334726c1e12514d9b76f351bede5f6a6373df5574eAmit Mahajan return mConnections.size() == mOwner.getMaxConnectionsPerCall(); 1340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1363a96b0ee1d152549279c58ba24a0a035cc9a557bAmit Mahajan //***** Called from GsmCdmaCallTracker 1370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 1400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Called when this Call is being hung up locally (eg, user pressed "end") 1410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Note that at this point, the hangup request has been dispatched to the radio 1420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * but no response has yet been received so update() has not yet been called 1430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 1443a96b0ee1d152549279c58ba24a0a035cc9a557bAmit Mahajan void onHangupLocal() { 14522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville for (int i = 0, s = mConnections.size(); i < s; i++) { 1463a96b0ee1d152549279c58ba24a0a035cc9a557bAmit Mahajan GsmCdmaConnection cn = (GsmCdmaConnection)mConnections.get(i); 1470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville cn.onHangupLocal(); 1490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 15022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mState = State.DISCONNECTING; 1510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1523a96b0ee1d152549279c58ba24a0a035cc9a557bAmit Mahajan}