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 import android.util.Log; 19 20 /** 21 * {@hide} 22 */ 23 public abstract class Connection { 24 25 // Number presentation type for caller id display 26 public static int PRESENTATION_ALLOWED = 1; // normal 27 public static int PRESENTATION_RESTRICTED = 2; // block by user 28 public static int PRESENTATION_UNKNOWN = 3; // no specified or unknown by network 29 public static int PRESENTATION_PAYPHONE = 4; // show pay phone info 30 31 private static String LOG_TAG = "TelephonyConnection"; 32 33 public enum DisconnectCause { 34 NOT_DISCONNECTED, /* has not yet disconnected */ 35 INCOMING_MISSED, /* an incoming call that was missed and never answered */ 36 NORMAL, /* normal; remote */ 37 LOCAL, /* normal; local hangup */ 38 BUSY, /* outgoing call to busy line */ 39 CONGESTION, /* outgoing call to congested network */ 40 MMI, /* not presently used; dial() returns null */ 41 INVALID_NUMBER, /* invalid dial string */ 42 LOST_SIGNAL, 43 LIMIT_EXCEEDED, /* eg GSM ACM limit exceeded */ 44 INCOMING_REJECTED, /* an incoming call that was rejected */ 45 POWER_OFF, /* radio is turned off explicitly */ 46 OUT_OF_SERVICE, /* out of service */ 47 ICC_ERROR, /* No ICC, ICC locked, or other ICC error */ 48 CALL_BARRED, /* call was blocked by call barrring */ 49 FDN_BLOCKED, /* call was blocked by fixed dial number */ 50 CS_RESTRICTED, /* call was blocked by restricted all voice access */ 51 CS_RESTRICTED_NORMAL, /* call was blocked by restricted normal voice access */ 52 CS_RESTRICTED_EMERGENCY, /* call was blocked by restricted emergency voice access */ 53 CDMA_LOCKED_UNTIL_POWER_CYCLE, /* MS is locked until next power cycle */ 54 CDMA_DROP, 55 CDMA_INTERCEPT, /* INTERCEPT order received, MS state idle entered */ 56 CDMA_REORDER, /* MS has been redirected, call is cancelled */ 57 CDMA_SO_REJECT, /* service option rejection */ 58 CDMA_RETRY_ORDER, /* requeseted service is rejected, retry delay is set */ 59 CDMA_ACCESS_FAILURE, 60 CDMA_PREEMPTED, 61 CDMA_NOT_EMERGENCY, /* not an emergency call */ 62 CDMA_ACCESS_BLOCKED, /* Access Blocked by CDMA network */ 63 ERROR_UNSPECIFIED 64 } 65 66 Object userData; 67 68 /* Instance Methods */ 69 70 /** 71 * Gets address (e.g., phone number) associated with connection 72 * TODO: distinguish reasons for unavailablity 73 * 74 * @return address or null if unavailable 75 */ 76 77 public abstract String getAddress(); 78 79 /** 80 * Gets cdma CNAP name associated with connection 81 * @return cnap name or null if unavailable 82 */ 83 public String getCnapName() { 84 return null; 85 } 86 87 /** 88 * Get orignal dial string 89 * @return orignal dial string or null if unavailable 90 */ 91 public String getOrigDialString(){ 92 return null; 93 } 94 95 /** 96 * Gets cdma CNAP presentation associated with connection 97 * @return cnap name or null if unavailable 98 */ 99 100 public int getCnapNamePresentation() { 101 return 0; 102 }; 103 104 /** 105 * @return Call that owns this Connection, or null if none 106 */ 107 public abstract Call getCall(); 108 109 /** 110 * Connection create time in currentTimeMillis() format 111 * Basically, set when object is created. 112 * Effectively, when an incoming call starts ringing or an 113 * outgoing call starts dialing 114 */ 115 public abstract long getCreateTime(); 116 117 /** 118 * Connection connect time in currentTimeMillis() format 119 * For outgoing calls: Begins at (DIALING|ALERTING) -> ACTIVE transition 120 * For incoming calls: Begins at (INCOMING|WAITING) -> ACTIVE transition 121 * Returns 0 before then 122 */ 123 public abstract long getConnectTime(); 124 125 /** 126 * Disconnect time in currentTimeMillis() format 127 * The time when this Connection makes a transition into ENDED or FAIL 128 * Returns 0 before then 129 */ 130 public abstract long getDisconnectTime(); 131 132 /** 133 * returns the number of milliseconds the call has been connected, 134 * or 0 if the call has never connected. 135 * If the call is still connected, then returns the elapsed 136 * time since connect 137 */ 138 public abstract long getDurationMillis(); 139 140 /** 141 * If this connection is HOLDING, return the number of milliseconds 142 * that it has been on hold for (approximently) 143 * If this connection is in any other state, return 0 144 */ 145 146 public abstract long getHoldDurationMillis(); 147 148 /** 149 * Returns "NOT_DISCONNECTED" if not yet disconnected 150 */ 151 public abstract DisconnectCause getDisconnectCause(); 152 153 /** 154 * Returns true of this connection originated elsewhere 155 * ("MT" or mobile terminated; another party called this terminal) 156 * or false if this call originated here (MO or mobile originated) 157 */ 158 public abstract boolean isIncoming(); 159 160 /** 161 * If this Connection is connected, then it is associated with 162 * a Call. 163 * 164 * Returns getCall().getState() or Call.State.IDLE if not 165 * connected 166 */ 167 public Call.State getState() { 168 Call c; 169 170 c = getCall(); 171 172 if (c == null) { 173 return Call.State.IDLE; 174 } else { 175 return c.getState(); 176 } 177 } 178 179 /** 180 * isAlive() 181 * 182 * @return true if the connection isn't disconnected 183 * (could be active, holding, ringing, dialing, etc) 184 */ 185 public boolean 186 isAlive() { 187 return getState().isAlive(); 188 } 189 190 /** 191 * Returns true if Connection is connected and is INCOMING or WAITING 192 */ 193 public boolean 194 isRinging() { 195 return getState().isRinging(); 196 } 197 198 /** 199 * 200 * @return the userdata set in setUserData() 201 */ 202 public Object getUserData() { 203 return userData; 204 } 205 206 /** 207 * 208 * @param userdata user can store an any userdata in the Connection object. 209 */ 210 public void setUserData(Object userdata) { 211 this.userData = userdata; 212 } 213 214 /** 215 * Hangup individual Connection 216 */ 217 public abstract void hangup() throws CallStateException; 218 219 /** 220 * Separate this call from its owner Call and assigns it to a new Call 221 * (eg if it is currently part of a Conference call 222 * TODO: Throw exception? Does GSM require error display on failure here? 223 */ 224 public abstract void separate() throws CallStateException; 225 226 public enum PostDialState { 227 NOT_STARTED, /* The post dial string playback hasn't 228 been started, or this call is not yet 229 connected, or this is an incoming call */ 230 STARTED, /* The post dial string playback has begun */ 231 WAIT, /* The post dial string playback is waiting for a 232 call to proceedAfterWaitChar() */ 233 WILD, /* The post dial string playback is waiting for a 234 call to proceedAfterWildChar() */ 235 COMPLETE, /* The post dial string playback is complete */ 236 CANCELLED, /* The post dial string playback was cancelled 237 with cancelPostDial() */ 238 PAUSE /* The post dial string playback is pausing for a 239 call to processNextPostDialChar*/ 240 } 241 242 public void clearUserData(){ 243 userData = null; 244 } 245 246 public abstract PostDialState getPostDialState(); 247 248 /** 249 * Returns the portion of the post dial string that has not 250 * yet been dialed, or "" if none 251 */ 252 public abstract String getRemainingPostDialString(); 253 254 /** 255 * See Phone.setOnPostDialWaitCharacter() 256 */ 257 258 public abstract void proceedAfterWaitChar(); 259 260 /** 261 * See Phone.setOnPostDialWildCharacter() 262 */ 263 public abstract void proceedAfterWildChar(String str); 264 /** 265 * Cancel any post 266 */ 267 public abstract void cancelPostDial(); 268 269 /** 270 * Returns the caller id presentation type for incoming and waiting calls 271 * @return one of PRESENTATION_* 272 */ 273 public abstract int getNumberPresentation(); 274 275 /** 276 * Build a human representation of a connection instance, suitable for debugging. 277 * Don't log personal stuff unless in debug mode. 278 * @return a string representing the internal state of this connection. 279 */ 280 public String toString() { 281 StringBuilder str = new StringBuilder(128); 282 283 if (Log.isLoggable(LOG_TAG, Log.DEBUG)) { 284 str.append("addr: " + getAddress()) 285 .append(" pres.: " + getNumberPresentation()) 286 .append(" dial: " + getOrigDialString()) 287 .append(" postdial: " + getRemainingPostDialString()) 288 .append(" cnap name: " + getCnapName()) 289 .append("(" + getCnapNamePresentation() + ")"); 290 } 291 str.append(" incoming: " + isIncoming()) 292 .append(" state: " + getState()) 293 .append(" post dial state: " + getPostDialState()); 294 return str.toString(); 295 } 296 } 297