1 /* 2 * Copyright (C) 2014 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 android.bluetooth; 18 19 import android.os.Parcel; 20 import android.os.Parcelable; 21 import android.os.SystemClock; 22 23 import java.util.UUID; 24 25 /** 26 * This class represents a single call, its state and properties. 27 * It implements {@link Parcelable} for inter-process message passing. 28 * 29 * @hide 30 */ 31 public final class BluetoothHeadsetClientCall implements Parcelable { 32 33 /* Call state */ 34 /** 35 * Call is active. 36 */ 37 public static final int CALL_STATE_ACTIVE = 0; 38 /** 39 * Call is in held state. 40 */ 41 public static final int CALL_STATE_HELD = 1; 42 /** 43 * Outgoing call that is being dialed right now. 44 */ 45 public static final int CALL_STATE_DIALING = 2; 46 /** 47 * Outgoing call that remote party has already been alerted about. 48 */ 49 public static final int CALL_STATE_ALERTING = 3; 50 /** 51 * Incoming call that can be accepted or rejected. 52 */ 53 public static final int CALL_STATE_INCOMING = 4; 54 /** 55 * Waiting call state when there is already an active call. 56 */ 57 public static final int CALL_STATE_WAITING = 5; 58 /** 59 * Call that has been held by response and hold 60 * (see Bluetooth specification for further references). 61 */ 62 public static final int CALL_STATE_HELD_BY_RESPONSE_AND_HOLD = 6; 63 /** 64 * Call that has been already terminated and should not be referenced as a valid call. 65 */ 66 public static final int CALL_STATE_TERMINATED = 7; 67 68 private final BluetoothDevice mDevice; 69 private final int mId; 70 private int mState; 71 private String mNumber; 72 private boolean mMultiParty; 73 private final boolean mOutgoing; 74 private final UUID mUUID; 75 private final long mCreationElapsedMilli; 76 private final boolean mInBandRing; 77 78 /** 79 * Creates BluetoothHeadsetClientCall instance. 80 */ BluetoothHeadsetClientCall(BluetoothDevice device, int id, int state, String number, boolean multiParty, boolean outgoing, boolean inBandRing)81 public BluetoothHeadsetClientCall(BluetoothDevice device, int id, int state, String number, 82 boolean multiParty, boolean outgoing, boolean inBandRing) { 83 this(device, id, UUID.randomUUID(), state, number, multiParty, outgoing, inBandRing); 84 } 85 BluetoothHeadsetClientCall(BluetoothDevice device, int id, UUID uuid, int state, String number, boolean multiParty, boolean outgoing, boolean inBandRing)86 public BluetoothHeadsetClientCall(BluetoothDevice device, int id, UUID uuid, int state, 87 String number, boolean multiParty, boolean outgoing, boolean inBandRing) { 88 mDevice = device; 89 mId = id; 90 mUUID = uuid; 91 mState = state; 92 mNumber = number != null ? number : ""; 93 mMultiParty = multiParty; 94 mOutgoing = outgoing; 95 mInBandRing = inBandRing; 96 mCreationElapsedMilli = SystemClock.elapsedRealtime(); 97 } 98 99 /** 100 * Sets call's state. 101 * 102 * <p>Note: This is an internal function and shouldn't be exposed</p> 103 * 104 * @param state new call state. 105 */ setState(int state)106 public void setState(int state) { 107 mState = state; 108 } 109 110 /** 111 * Sets call's number. 112 * 113 * <p>Note: This is an internal function and shouldn't be exposed</p> 114 * 115 * @param number String representing phone number. 116 */ setNumber(String number)117 public void setNumber(String number) { 118 mNumber = number; 119 } 120 121 /** 122 * Sets this call as multi party call. 123 * 124 * <p>Note: This is an internal function and shouldn't be exposed</p> 125 * 126 * @param multiParty if <code>true</code> sets this call as a part of multi party conference. 127 */ setMultiParty(boolean multiParty)128 public void setMultiParty(boolean multiParty) { 129 mMultiParty = multiParty; 130 } 131 132 /** 133 * Gets call's device. 134 * 135 * @return call device. 136 */ getDevice()137 public BluetoothDevice getDevice() { 138 return mDevice; 139 } 140 141 /** 142 * Gets call's Id. 143 * 144 * @return call id. 145 */ getId()146 public int getId() { 147 return mId; 148 } 149 150 /** 151 * Gets call's UUID. 152 * 153 * @return call uuid 154 * @hide 155 */ getUUID()156 public UUID getUUID() { 157 return mUUID; 158 } 159 160 /** 161 * Gets call's current state. 162 * 163 * @return state of this particular phone call. 164 */ getState()165 public int getState() { 166 return mState; 167 } 168 169 /** 170 * Gets call's number. 171 * 172 * @return string representing phone number. 173 */ getNumber()174 public String getNumber() { 175 return mNumber; 176 } 177 178 /** 179 * Gets call's creation time in millis since epoch. 180 * 181 * @return long representing the creation time. 182 */ getCreationElapsedMilli()183 public long getCreationElapsedMilli() { 184 return mCreationElapsedMilli; 185 } 186 187 /** 188 * Checks if call is an active call in a conference mode (aka multi party). 189 * 190 * @return <code>true</code> if call is a multi party call, <code>false</code> otherwise. 191 */ isMultiParty()192 public boolean isMultiParty() { 193 return mMultiParty; 194 } 195 196 /** 197 * Checks if this call is an outgoing call. 198 * 199 * @return <code>true</code> if its outgoing call, <code>false</code> otherwise. 200 */ isOutgoing()201 public boolean isOutgoing() { 202 return mOutgoing; 203 } 204 205 /** 206 * Checks if the ringtone will be generated by the connected phone 207 * 208 * @return <code>true</code> if in band ring is enabled, <code>false</code> otherwise. 209 */ isInBandRing()210 public boolean isInBandRing() { 211 return mInBandRing; 212 } 213 214 215 @Override toString()216 public String toString() { 217 return toString(false); 218 } 219 220 /** 221 * Generate a log string for this call 222 * @param loggable whether device address should be logged 223 * @return log string 224 */ toString(boolean loggable)225 public String toString(boolean loggable) { 226 StringBuilder builder = new StringBuilder("BluetoothHeadsetClientCall{mDevice: "); 227 builder.append(loggable ? mDevice : mDevice.hashCode()); 228 builder.append(", mId: "); 229 builder.append(mId); 230 builder.append(", mUUID: "); 231 builder.append(mUUID); 232 builder.append(", mState: "); 233 switch (mState) { 234 case CALL_STATE_ACTIVE: 235 builder.append("ACTIVE"); 236 break; 237 case CALL_STATE_HELD: 238 builder.append("HELD"); 239 break; 240 case CALL_STATE_DIALING: 241 builder.append("DIALING"); 242 break; 243 case CALL_STATE_ALERTING: 244 builder.append("ALERTING"); 245 break; 246 case CALL_STATE_INCOMING: 247 builder.append("INCOMING"); 248 break; 249 case CALL_STATE_WAITING: 250 builder.append("WAITING"); 251 break; 252 case CALL_STATE_HELD_BY_RESPONSE_AND_HOLD: 253 builder.append("HELD_BY_RESPONSE_AND_HOLD"); 254 break; 255 case CALL_STATE_TERMINATED: 256 builder.append("TERMINATED"); 257 break; 258 default: 259 builder.append(mState); 260 break; 261 } 262 builder.append(", mNumber: "); 263 builder.append(loggable ? mNumber : mNumber.hashCode()); 264 builder.append(", mMultiParty: "); 265 builder.append(mMultiParty); 266 builder.append(", mOutgoing: "); 267 builder.append(mOutgoing); 268 builder.append(", mInBandRing: "); 269 builder.append(mInBandRing); 270 builder.append("}"); 271 return builder.toString(); 272 } 273 274 /** 275 * {@link Parcelable.Creator} interface implementation. 276 */ 277 public static final Parcelable.Creator<BluetoothHeadsetClientCall> CREATOR = 278 new Parcelable.Creator<BluetoothHeadsetClientCall>() { 279 @Override 280 public BluetoothHeadsetClientCall createFromParcel(Parcel in) { 281 return new BluetoothHeadsetClientCall((BluetoothDevice) in.readParcelable(null), 282 in.readInt(), UUID.fromString(in.readString()), in.readInt(), 283 in.readString(), in.readInt() == 1, in.readInt() == 1, 284 in.readInt() == 1); 285 } 286 287 @Override 288 public BluetoothHeadsetClientCall[] newArray(int size) { 289 return new BluetoothHeadsetClientCall[size]; 290 } 291 }; 292 293 @Override writeToParcel(Parcel out, int flags)294 public void writeToParcel(Parcel out, int flags) { 295 out.writeParcelable(mDevice, 0); 296 out.writeInt(mId); 297 out.writeString(mUUID.toString()); 298 out.writeInt(mState); 299 out.writeString(mNumber); 300 out.writeInt(mMultiParty ? 1 : 0); 301 out.writeInt(mOutgoing ? 1 : 0); 302 out.writeInt(mInBandRing ? 1 : 0); 303 } 304 305 @Override describeContents()306 public int describeContents() { 307 return 0; 308 } 309 } 310