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