Home | History | Annotate | Download | only in telephony
      1 /*
      2  * Copyright (C) 2015 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 package com.android.internal.telephony;
     18 
     19 import java.util.List;
     20 
     21 /**
     22  * {@hide}
     23  */
     24 public class GsmCdmaCall extends Call {
     25     /*************************** Instance Variables **************************/
     26 
     27     /*package*/ GsmCdmaCallTracker mOwner;
     28 
     29     /****************************** Constructors *****************************/
     30     /*package*/
     31     public GsmCdmaCall (GsmCdmaCallTracker owner) {
     32         mOwner = owner;
     33     }
     34 
     35     /************************** Overridden from Call *************************/
     36 
     37     @Override
     38     public List<Connection> getConnections() {
     39         // FIXME should return Collections.unmodifiableList();
     40         return mConnections;
     41     }
     42 
     43     @Override
     44     public Phone getPhone() {
     45         return mOwner.getPhone();
     46     }
     47 
     48     @Override
     49     public boolean isMultiparty() {
     50         return mConnections.size() > 1;
     51     }
     52 
     53     /** Please note: if this is the foreground call and a
     54      *  background call exists, the background call will be resumed
     55      *  because an AT+CHLD=1 will be sent
     56      */
     57     @Override
     58     public void hangup() throws CallStateException {
     59         mOwner.hangup(this);
     60     }
     61 
     62     @Override
     63     public String toString() {
     64         return mState.toString();
     65     }
     66 
     67     //***** Called from GsmCdmaConnection
     68 
     69     public void attach(Connection conn, DriverCall dc) {
     70         mConnections.add(conn);
     71 
     72         mState = stateFromDCState (dc.state);
     73     }
     74 
     75     public void attachFake(Connection conn, State state) {
     76         mConnections.add(conn);
     77 
     78         mState = state;
     79     }
     80 
     81     /**
     82      * Called by GsmCdmaConnection when it has disconnected
     83      */
     84     public boolean connectionDisconnected(GsmCdmaConnection conn) {
     85         if (mState != State.DISCONNECTED) {
     86             /* If only disconnected connections remain, we are disconnected*/
     87 
     88             boolean hasOnlyDisconnectedConnections = true;
     89 
     90             for (int i = 0, s = mConnections.size(); i < s; i ++) {
     91                 if (mConnections.get(i).getState() != State.DISCONNECTED) {
     92                     hasOnlyDisconnectedConnections = false;
     93                     break;
     94                 }
     95             }
     96 
     97             if (hasOnlyDisconnectedConnections) {
     98                 mState = State.DISCONNECTED;
     99                 return true;
    100             }
    101         }
    102 
    103         return false;
    104     }
    105 
    106     public void detach(GsmCdmaConnection conn) {
    107         mConnections.remove(conn);
    108 
    109         if (mConnections.size() == 0) {
    110             mState = State.IDLE;
    111         }
    112     }
    113 
    114     /*package*/ boolean update (GsmCdmaConnection conn, DriverCall dc) {
    115         State newState;
    116         boolean changed = false;
    117 
    118         newState = stateFromDCState(dc.state);
    119 
    120         if (newState != mState) {
    121             mState = newState;
    122             changed = true;
    123         }
    124 
    125         return changed;
    126     }
    127 
    128     /**
    129      * @return true if there's no space in this call for additional
    130      * connections to be added via "conference"
    131      */
    132     /*package*/ boolean isFull() {
    133         return mConnections.size() == mOwner.getMaxConnectionsPerCall();
    134     }
    135 
    136     //***** Called from GsmCdmaCallTracker
    137 
    138 
    139     /**
    140      * Called when this Call is being hung up locally (eg, user pressed "end")
    141      * Note that at this point, the hangup request has been dispatched to the radio
    142      * but no response has yet been received so update() has not yet been called
    143      */
    144     void onHangupLocal() {
    145         for (int i = 0, s = mConnections.size(); i < s; i++) {
    146             GsmCdmaConnection cn = (GsmCdmaConnection)mConnections.get(i);
    147 
    148             cn.onHangupLocal();
    149         }
    150         mState = State.DISCONNECTING;
    151     }
    152 }