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