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