1 /* 2 * Copyright 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.telecom; 18 19 import android.net.Uri; 20 import android.os.Bundle; 21 import android.os.Parcel; 22 import android.os.Parcelable; 23 import android.os.RemoteException; 24 25 import java.util.ArrayList; 26 import java.util.Collections; 27 import java.util.List; 28 29 import com.android.internal.telecom.IVideoProvider; 30 31 /** 32 * Information about a call that is used between InCallService and Telecom. 33 * @hide 34 */ 35 public final class ParcelableCall implements Parcelable { 36 private final String mId; 37 private final int mState; 38 private final DisconnectCause mDisconnectCause; 39 private final List<String> mCannedSmsResponses; 40 private final int mCapabilities; 41 private final int mProperties; 42 private final long mConnectTimeMillis; 43 private final Uri mHandle; 44 private final int mHandlePresentation; 45 private final String mCallerDisplayName; 46 private final int mCallerDisplayNamePresentation; 47 private final GatewayInfo mGatewayInfo; 48 private final PhoneAccountHandle mAccountHandle; 49 private final IVideoProvider mVideoCallProvider; 50 private InCallService.VideoCall mVideoCall; 51 private final String mParentCallId; 52 private final List<String> mChildCallIds; 53 private final StatusHints mStatusHints; 54 private final int mVideoState; 55 private final List<String> mConferenceableCallIds; 56 private final Bundle mExtras; 57 ParcelableCall( String id, int state, DisconnectCause disconnectCause, List<String> cannedSmsResponses, int capabilities, int properties, long connectTimeMillis, Uri handle, int handlePresentation, String callerDisplayName, int callerDisplayNamePresentation, GatewayInfo gatewayInfo, PhoneAccountHandle accountHandle, IVideoProvider videoCallProvider, String parentCallId, List<String> childCallIds, StatusHints statusHints, int videoState, List<String> conferenceableCallIds, Bundle extras)58 public ParcelableCall( 59 String id, 60 int state, 61 DisconnectCause disconnectCause, 62 List<String> cannedSmsResponses, 63 int capabilities, 64 int properties, 65 long connectTimeMillis, 66 Uri handle, 67 int handlePresentation, 68 String callerDisplayName, 69 int callerDisplayNamePresentation, 70 GatewayInfo gatewayInfo, 71 PhoneAccountHandle accountHandle, 72 IVideoProvider videoCallProvider, 73 String parentCallId, 74 List<String> childCallIds, 75 StatusHints statusHints, 76 int videoState, 77 List<String> conferenceableCallIds, 78 Bundle extras) { 79 mId = id; 80 mState = state; 81 mDisconnectCause = disconnectCause; 82 mCannedSmsResponses = cannedSmsResponses; 83 mCapabilities = capabilities; 84 mProperties = properties; 85 mConnectTimeMillis = connectTimeMillis; 86 mHandle = handle; 87 mHandlePresentation = handlePresentation; 88 mCallerDisplayName = callerDisplayName; 89 mCallerDisplayNamePresentation = callerDisplayNamePresentation; 90 mGatewayInfo = gatewayInfo; 91 mAccountHandle = accountHandle; 92 mVideoCallProvider = videoCallProvider; 93 mParentCallId = parentCallId; 94 mChildCallIds = childCallIds; 95 mStatusHints = statusHints; 96 mVideoState = videoState; 97 mConferenceableCallIds = Collections.unmodifiableList(conferenceableCallIds); 98 mExtras = extras; 99 } 100 101 /** The unique ID of the call. */ getId()102 public String getId() { 103 return mId; 104 } 105 106 /** The current state of the call. */ getState()107 public int getState() { 108 return mState; 109 } 110 111 /** 112 * Reason for disconnection, as described by {@link android.telecomm.DisconnectCause}. Valid 113 * when call state is {@link CallState#DISCONNECTED}. 114 */ getDisconnectCause()115 public DisconnectCause getDisconnectCause() { 116 return mDisconnectCause; 117 } 118 119 /** 120 * The set of possible text message responses when this call is incoming. 121 */ getCannedSmsResponses()122 public List<String> getCannedSmsResponses() { 123 return mCannedSmsResponses; 124 } 125 126 // Bit mask of actions a call supports, values are defined in {@link CallCapabilities}. getCapabilities()127 public int getCapabilities() { 128 return mCapabilities; 129 } 130 131 /** Bitmask of properties of the call. */ getProperties()132 public int getProperties() { return mProperties; } 133 134 /** The time that the call switched to the active state. */ getConnectTimeMillis()135 public long getConnectTimeMillis() { 136 return mConnectTimeMillis; 137 } 138 139 /** The endpoint to which the call is connected. */ getHandle()140 public Uri getHandle() { 141 return mHandle; 142 } 143 144 /** 145 * The presentation requirements for the handle. See {@link TelecomManager} for valid values. 146 */ getHandlePresentation()147 public int getHandlePresentation() { 148 return mHandlePresentation; 149 } 150 151 /** The endpoint to which the call is connected. */ getCallerDisplayName()152 public String getCallerDisplayName() { 153 return mCallerDisplayName; 154 } 155 156 /** 157 * The presentation requirements for the caller display name. 158 * See {@link TelecomManager} for valid values. 159 */ getCallerDisplayNamePresentation()160 public int getCallerDisplayNamePresentation() { 161 return mCallerDisplayNamePresentation; 162 } 163 164 /** Gateway information for the call. */ getGatewayInfo()165 public GatewayInfo getGatewayInfo() { 166 return mGatewayInfo; 167 } 168 169 /** PhoneAccountHandle information for the call. */ getAccountHandle()170 public PhoneAccountHandle getAccountHandle() { 171 return mAccountHandle; 172 } 173 174 /** 175 * Returns an object for remotely communicating through the video call provider's binder. 176 * @return The video call. 177 */ getVideoCall()178 public InCallService.VideoCall getVideoCall() { 179 if (mVideoCall == null && mVideoCallProvider != null) { 180 try { 181 mVideoCall = new VideoCallImpl(mVideoCallProvider); 182 } catch (RemoteException ignored) { 183 // Ignore RemoteException. 184 } 185 } 186 187 return mVideoCall; 188 } 189 190 /** 191 * The conference call to which this call is conferenced. Null if not conferenced. 192 */ getParentCallId()193 public String getParentCallId() { 194 return mParentCallId; 195 } 196 197 /** 198 * The child call-IDs if this call is a conference call. Returns an empty list if this is not 199 * a conference call or if the conference call contains no children. 200 */ getChildCallIds()201 public List<String> getChildCallIds() { 202 return mChildCallIds; 203 } 204 getConferenceableCallIds()205 public List<String> getConferenceableCallIds() { 206 return mConferenceableCallIds; 207 } 208 209 /** 210 * The status label and icon. 211 * 212 * @return Status hints. 213 */ getStatusHints()214 public StatusHints getStatusHints() { 215 return mStatusHints; 216 } 217 218 /** 219 * The video state. 220 * @return The video state of the call. 221 */ getVideoState()222 public int getVideoState() { 223 return mVideoState; 224 } 225 226 /** 227 * Any extras to pass with the call 228 * 229 * @return a bundle of extras 230 */ getExtras()231 public Bundle getExtras() { 232 return mExtras; 233 } 234 235 /** Responsible for creating ParcelableCall objects for deserialized Parcels. */ 236 public static final Parcelable.Creator<ParcelableCall> CREATOR = 237 new Parcelable.Creator<ParcelableCall> () { 238 @Override 239 public ParcelableCall createFromParcel(Parcel source) { 240 ClassLoader classLoader = ParcelableCall.class.getClassLoader(); 241 String id = source.readString(); 242 int state = source.readInt(); 243 DisconnectCause disconnectCause = source.readParcelable(classLoader); 244 List<String> cannedSmsResponses = new ArrayList<>(); 245 source.readList(cannedSmsResponses, classLoader); 246 int capabilities = source.readInt(); 247 int properties = source.readInt(); 248 long connectTimeMillis = source.readLong(); 249 Uri handle = source.readParcelable(classLoader); 250 int handlePresentation = source.readInt(); 251 String callerDisplayName = source.readString(); 252 int callerDisplayNamePresentation = source.readInt(); 253 GatewayInfo gatewayInfo = source.readParcelable(classLoader); 254 PhoneAccountHandle accountHandle = source.readParcelable(classLoader); 255 IVideoProvider videoCallProvider = 256 IVideoProvider.Stub.asInterface(source.readStrongBinder()); 257 String parentCallId = source.readString(); 258 List<String> childCallIds = new ArrayList<>(); 259 source.readList(childCallIds, classLoader); 260 StatusHints statusHints = source.readParcelable(classLoader); 261 int videoState = source.readInt(); 262 List<String> conferenceableCallIds = new ArrayList<>(); 263 source.readList(conferenceableCallIds, classLoader); 264 Bundle extras = source.readParcelable(classLoader); 265 return new ParcelableCall( 266 id, 267 state, 268 disconnectCause, 269 cannedSmsResponses, 270 capabilities, 271 properties, 272 connectTimeMillis, 273 handle, 274 handlePresentation, 275 callerDisplayName, 276 callerDisplayNamePresentation, 277 gatewayInfo, 278 accountHandle, 279 videoCallProvider, 280 parentCallId, 281 childCallIds, 282 statusHints, 283 videoState, 284 conferenceableCallIds, 285 extras); 286 } 287 288 @Override 289 public ParcelableCall[] newArray(int size) { 290 return new ParcelableCall[size]; 291 } 292 }; 293 294 /** {@inheritDoc} */ 295 @Override describeContents()296 public int describeContents() { 297 return 0; 298 } 299 300 /** Writes ParcelableCall object into a Parcel. */ 301 @Override writeToParcel(Parcel destination, int flags)302 public void writeToParcel(Parcel destination, int flags) { 303 destination.writeString(mId); 304 destination.writeInt(mState); 305 destination.writeParcelable(mDisconnectCause, 0); 306 destination.writeList(mCannedSmsResponses); 307 destination.writeInt(mCapabilities); 308 destination.writeInt(mProperties); 309 destination.writeLong(mConnectTimeMillis); 310 destination.writeParcelable(mHandle, 0); 311 destination.writeInt(mHandlePresentation); 312 destination.writeString(mCallerDisplayName); 313 destination.writeInt(mCallerDisplayNamePresentation); 314 destination.writeParcelable(mGatewayInfo, 0); 315 destination.writeParcelable(mAccountHandle, 0); 316 destination.writeStrongBinder( 317 mVideoCallProvider != null ? mVideoCallProvider.asBinder() : null); 318 destination.writeString(mParentCallId); 319 destination.writeList(mChildCallIds); 320 destination.writeParcelable(mStatusHints, 0); 321 destination.writeInt(mVideoState); 322 destination.writeList(mConferenceableCallIds); 323 destination.writeParcelable(mExtras, 0); 324 } 325 326 @Override toString()327 public String toString() { 328 return String.format("[%s, parent:%s, children:%s]", mId, mParentCallId, mChildCallIds); 329 } 330 } 331