Home | History | Annotate | Download | only in telephony
      1 /*
      2  * Copyright (C) 2006 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 import android.util.Log;
     22 
     23 /**
     24  * {@hide}
     25  */
     26 public abstract class Call {
     27     /* Enums */
     28 
     29     public enum State {
     30         IDLE, ACTIVE, HOLDING, DIALING, ALERTING, INCOMING, WAITING, DISCONNECTED, DISCONNECTING;
     31 
     32         public boolean isAlive() {
     33             return !(this == IDLE || this == DISCONNECTED || this == DISCONNECTING);
     34         }
     35 
     36         public boolean isRinging() {
     37             return this == INCOMING || this == WAITING;
     38         }
     39 
     40         public boolean isDialing() {
     41             return this == DIALING || this == ALERTING;
     42         }
     43     }
     44 
     45 
     46     /* Instance Variables */
     47 
     48     public State state = State.IDLE;
     49 
     50 
     51     // Flag to indicate if the current calling/caller information
     52     // is accurate. If false the information is known to be accurate.
     53     //
     54     // For CDMA, during call waiting/3 way, there is no network response
     55     // if call waiting is answered, network timed out, dropped, 3 way
     56     // merged, etc.
     57     protected boolean isGeneric = false;
     58 
     59     protected final String LOG_TAG = "Call";
     60 
     61     /* Instance Methods */
     62 
     63     /** Do not modify the List result!!! This list is not yours to keep
     64      *  It will change across event loop iterations            top
     65      */
     66 
     67     public abstract List<Connection> getConnections();
     68     public abstract Phone getPhone();
     69     public abstract boolean isMultiparty();
     70     public abstract void hangup() throws CallStateException;
     71 
     72 
     73     /**
     74      * hasConnection
     75      *
     76      * @param c a Connection object
     77      * @return true if the call contains the connection object passed in
     78      */
     79     public boolean hasConnection(Connection c) {
     80         return c.getCall() == this;
     81     }
     82 
     83     /**
     84      * hasConnections
     85      * @return true if the call contains one or more connections
     86      */
     87     public boolean hasConnections() {
     88         List connections = getConnections();
     89 
     90         if (connections == null) {
     91             return false;
     92         }
     93 
     94         return connections.size() > 0;
     95     }
     96 
     97     /**
     98      * getState
     99      * @return state of class call
    100      */
    101     public State getState() {
    102         return state;
    103     }
    104 
    105     /**
    106      * isIdle
    107      *
    108      * FIXME rename
    109      * @return true if the call contains only disconnected connections (if any)
    110      */
    111     public boolean isIdle() {
    112         return !getState().isAlive();
    113     }
    114 
    115     /**
    116      * Returns the Connection associated with this Call that was created
    117      * first, or null if there are no Connections in this Call
    118      */
    119     public Connection
    120     getEarliestConnection() {
    121         List l;
    122         long time = Long.MAX_VALUE;
    123         Connection c;
    124         Connection earliest = null;
    125 
    126         l = getConnections();
    127 
    128         if (l.size() == 0) {
    129             return null;
    130         }
    131 
    132         for (int i = 0, s = l.size() ; i < s ; i++) {
    133             c = (Connection) l.get(i);
    134             long t;
    135 
    136             t = c.getCreateTime();
    137 
    138             if (t < time) {
    139                 earliest = c;
    140                 time = t;
    141             }
    142         }
    143 
    144         return earliest;
    145     }
    146 
    147     public long
    148     getEarliestCreateTime() {
    149         List l;
    150         long time = Long.MAX_VALUE;
    151 
    152         l = getConnections();
    153 
    154         if (l.size() == 0) {
    155             return 0;
    156         }
    157 
    158         for (int i = 0, s = l.size() ; i < s ; i++) {
    159             Connection c = (Connection) l.get(i);
    160             long t;
    161 
    162             t = c.getCreateTime();
    163 
    164             time = t < time ? t : time;
    165         }
    166 
    167         return time;
    168     }
    169 
    170     public long
    171     getEarliestConnectTime() {
    172         long time = Long.MAX_VALUE;
    173         List l = getConnections();
    174 
    175         if (l.size() == 0) {
    176             return 0;
    177         }
    178 
    179         for (int i = 0, s = l.size() ; i < s ; i++) {
    180             Connection c = (Connection) l.get(i);
    181             long t;
    182 
    183             t = c.getConnectTime();
    184 
    185             time = t < time ? t : time;
    186         }
    187 
    188         return time;
    189     }
    190 
    191 
    192     public boolean
    193     isDialingOrAlerting() {
    194         return getState().isDialing();
    195     }
    196 
    197     public boolean
    198     isRinging() {
    199         return getState().isRinging();
    200     }
    201 
    202     /**
    203      * Returns the Connection associated with this Call that was created
    204      * last, or null if there are no Connections in this Call
    205      */
    206     public Connection
    207     getLatestConnection() {
    208         List l = getConnections();
    209         if (l.size() == 0) {
    210             return null;
    211         }
    212 
    213         long time = 0;
    214         Connection latest = null;
    215         for (int i = 0, s = l.size() ; i < s ; i++) {
    216             Connection c = (Connection) l.get(i);
    217             long t = c.getCreateTime();
    218 
    219             if (t > time) {
    220                 latest = c;
    221                 time = t;
    222             }
    223         }
    224 
    225         return latest;
    226     }
    227 
    228     /**
    229      * To indicate if the connection information is accurate
    230      * or not. false means accurate. Only used for CDMA.
    231      */
    232     public boolean isGeneric() {
    233         return isGeneric;
    234     }
    235 
    236     /**
    237      * Set the generic instance variable
    238      */
    239     public void setGeneric(boolean generic) {
    240         isGeneric = generic;
    241     }
    242 
    243     /**
    244      * Hangup call if it is alive
    245      */
    246     public void hangupIfAlive() {
    247         if (getState().isAlive()) {
    248             try {
    249                 hangup();
    250             } catch (CallStateException ex) {
    251                 Log.w(LOG_TAG, " hangupIfActive: caught " + ex);
    252             }
    253         }
    254     }
    255 }
    256