blob: 599c210585f47c2a10ae3c579baebdd87ecc4b5a [file] [log] [blame]
Sailesh Nepal60437932014-04-05 16:44:55 -07001/*
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
Tyler Gunnef9f6f92014-09-12 22:16:17 -070017package android.telecom;
Sailesh Nepal60437932014-04-05 16:44:55 -070018
19import android.net.Uri;
Nancy Chen10798dc2014-08-08 14:00:25 -070020import android.os.Bundle;
Sailesh Nepal60437932014-04-05 16:44:55 -070021import android.os.Parcel;
22import android.os.Parcelable;
Andrew Lee5dc30752014-06-27 17:02:19 -070023import android.os.RemoteException;
Sailesh Nepal60437932014-04-05 16:44:55 -070024
Santos Cordon980acb92014-05-31 10:31:19 -070025import java.util.ArrayList;
Santos Cordon7c7bc7f2014-07-28 18:15:48 -070026import java.util.Collections;
Santos Cordon980acb92014-05-31 10:31:19 -070027import java.util.List;
Sailesh Nepal60437932014-04-05 16:44:55 -070028
Tyler Gunnef9f6f92014-09-12 22:16:17 -070029import com.android.internal.telecom.IVideoProvider;
Ihab Awadb19a0bc2014-08-07 19:46:01 -070030
Sailesh Nepal60437932014-04-05 16:44:55 -070031/**
Tyler Gunnef9f6f92014-09-12 22:16:17 -070032 * Information about a call that is used between InCallService and Telecom.
Santos Cordon88b771d2014-07-19 13:10:40 -070033 * @hide
Sailesh Nepal60437932014-04-05 16:44:55 -070034 */
Santos Cordon88b771d2014-07-19 13:10:40 -070035public final class ParcelableCall implements Parcelable {
Sailesh Nepal60437932014-04-05 16:44:55 -070036 private final String mId;
Ihab Awadb19a0bc2014-08-07 19:46:01 -070037 private final int mState;
Andrew Lee7f3d41f2014-09-11 17:33:16 -070038 private final DisconnectCause mDisconnectCause;
Ihab Awadc0677542014-06-10 13:29:47 -070039 private final List<String> mCannedSmsResponses;
Sailesh Nepal60437932014-04-05 16:44:55 -070040 private final int mCapabilities;
Andrew Lee223ad142014-08-27 16:33:08 -070041 private final int mProperties;
Bryce Leedd976b12015-11-17 12:31:53 -080042 private final int mSupportedAudioRoutes;
Sailesh Nepal60437932014-04-05 16:44:55 -070043 private final long mConnectTimeMillis;
44 private final Uri mHandle;
Sailesh Nepal61203862014-07-11 14:50:13 -070045 private final int mHandlePresentation;
46 private final String mCallerDisplayName;
47 private final int mCallerDisplayNamePresentation;
Sailesh Nepal60437932014-04-05 16:44:55 -070048 private final GatewayInfo mGatewayInfo;
Evan Charlton8c8a0622014-07-20 12:31:00 -070049 private final PhoneAccountHandle mAccountHandle;
Tyler Gunn75958422015-04-15 14:23:42 -070050 private final boolean mIsVideoCallProviderChanged;
Ihab Awadb19a0bc2014-08-07 19:46:01 -070051 private final IVideoProvider mVideoCallProvider;
Andrew Lee50aca232014-07-22 16:41:54 -070052 private InCallService.VideoCall mVideoCall;
Santos Cordon980acb92014-05-31 10:31:19 -070053 private final String mParentCallId;
54 private final List<String> mChildCallIds;
Sailesh Nepale7ef59a2014-07-08 21:48:22 -070055 private final StatusHints mStatusHints;
Andrew Lee85f5d422014-07-11 17:22:03 -070056 private final int mVideoState;
Santos Cordon7c7bc7f2014-07-28 18:15:48 -070057 private final List<String> mConferenceableCallIds;
Santos Cordon6b7f9552015-05-27 17:21:45 -070058 private final Bundle mIntentExtras;
Nancy Chen10798dc2014-08-08 14:00:25 -070059 private final Bundle mExtras;
Santos Cordon980acb92014-05-31 10:31:19 -070060
Santos Cordon88b771d2014-07-19 13:10:40 -070061 public ParcelableCall(
Sailesh Nepal60437932014-04-05 16:44:55 -070062 String id,
Ihab Awadb19a0bc2014-08-07 19:46:01 -070063 int state,
Andrew Lee7f3d41f2014-09-11 17:33:16 -070064 DisconnectCause disconnectCause,
Ihab Awadc0677542014-06-10 13:29:47 -070065 List<String> cannedSmsResponses,
Sailesh Nepal60437932014-04-05 16:44:55 -070066 int capabilities,
Andrew Lee223ad142014-08-27 16:33:08 -070067 int properties,
Bryce Leedd976b12015-11-17 12:31:53 -080068 int supportedAudioRoutes,
Sailesh Nepal60437932014-04-05 16:44:55 -070069 long connectTimeMillis,
70 Uri handle,
Sailesh Nepal61203862014-07-11 14:50:13 -070071 int handlePresentation,
72 String callerDisplayName,
73 int callerDisplayNamePresentation,
Sailesh Nepal60437932014-04-05 16:44:55 -070074 GatewayInfo gatewayInfo,
Evan Charlton8c8a0622014-07-20 12:31:00 -070075 PhoneAccountHandle accountHandle,
Tyler Gunn75958422015-04-15 14:23:42 -070076 boolean isVideoCallProviderChanged,
Ihab Awadb19a0bc2014-08-07 19:46:01 -070077 IVideoProvider videoCallProvider,
Santos Cordon980acb92014-05-31 10:31:19 -070078 String parentCallId,
Tyler Gunn8d83fa92014-07-01 11:31:21 -070079 List<String> childCallIds,
Andrew Lee85f5d422014-07-11 17:22:03 -070080 StatusHints statusHints,
Santos Cordon7c7bc7f2014-07-28 18:15:48 -070081 int videoState,
Nancy Chen10798dc2014-08-08 14:00:25 -070082 List<String> conferenceableCallIds,
Santos Cordon6b7f9552015-05-27 17:21:45 -070083 Bundle intentExtras,
Jay Shrauner8f988432015-04-16 12:52:19 -070084 Bundle extras) {
Sailesh Nepal60437932014-04-05 16:44:55 -070085 mId = id;
86 mState = state;
Andrew Lee7f3d41f2014-09-11 17:33:16 -070087 mDisconnectCause = disconnectCause;
Ihab Awadc0677542014-06-10 13:29:47 -070088 mCannedSmsResponses = cannedSmsResponses;
Sailesh Nepal60437932014-04-05 16:44:55 -070089 mCapabilities = capabilities;
Andrew Lee223ad142014-08-27 16:33:08 -070090 mProperties = properties;
Bryce Leedd976b12015-11-17 12:31:53 -080091 mSupportedAudioRoutes = supportedAudioRoutes;
Sailesh Nepal60437932014-04-05 16:44:55 -070092 mConnectTimeMillis = connectTimeMillis;
93 mHandle = handle;
Sailesh Nepal61203862014-07-11 14:50:13 -070094 mHandlePresentation = handlePresentation;
95 mCallerDisplayName = callerDisplayName;
96 mCallerDisplayNamePresentation = callerDisplayNamePresentation;
Sailesh Nepal60437932014-04-05 16:44:55 -070097 mGatewayInfo = gatewayInfo;
Evan Charlton8c8a0622014-07-20 12:31:00 -070098 mAccountHandle = accountHandle;
Tyler Gunn75958422015-04-15 14:23:42 -070099 mIsVideoCallProviderChanged = isVideoCallProviderChanged;
Andrew Lee50aca232014-07-22 16:41:54 -0700100 mVideoCallProvider = videoCallProvider;
Santos Cordon980acb92014-05-31 10:31:19 -0700101 mParentCallId = parentCallId;
102 mChildCallIds = childCallIds;
Sailesh Nepale7ef59a2014-07-08 21:48:22 -0700103 mStatusHints = statusHints;
Andrew Lee85f5d422014-07-11 17:22:03 -0700104 mVideoState = videoState;
Santos Cordon7c7bc7f2014-07-28 18:15:48 -0700105 mConferenceableCallIds = Collections.unmodifiableList(conferenceableCallIds);
Santos Cordon6b7f9552015-05-27 17:21:45 -0700106 mIntentExtras = intentExtras;
Nancy Chen10798dc2014-08-08 14:00:25 -0700107 mExtras = extras;
Sailesh Nepal60437932014-04-05 16:44:55 -0700108 }
109
110 /** The unique ID of the call. */
111 public String getId() {
112 return mId;
113 }
114
115 /** The current state of the call. */
Ihab Awadb19a0bc2014-08-07 19:46:01 -0700116 public int getState() {
Sailesh Nepal60437932014-04-05 16:44:55 -0700117 return mState;
118 }
119
120 /**
Andrew Lee7f3d41f2014-09-11 17:33:16 -0700121 * Reason for disconnection, as described by {@link android.telecomm.DisconnectCause}. Valid
122 * when call state is {@link CallState#DISCONNECTED}.
Sailesh Nepal60437932014-04-05 16:44:55 -0700123 */
Andrew Lee7f3d41f2014-09-11 17:33:16 -0700124 public DisconnectCause getDisconnectCause() {
125 return mDisconnectCause;
Sailesh Nepal60437932014-04-05 16:44:55 -0700126 }
127
Ihab Awadc0677542014-06-10 13:29:47 -0700128 /**
129 * The set of possible text message responses when this call is incoming.
130 */
131 public List<String> getCannedSmsResponses() {
132 return mCannedSmsResponses;
133 }
134
Sailesh Nepal60437932014-04-05 16:44:55 -0700135 // Bit mask of actions a call supports, values are defined in {@link CallCapabilities}.
136 public int getCapabilities() {
137 return mCapabilities;
138 }
139
Andrew Lee223ad142014-08-27 16:33:08 -0700140 /** Bitmask of properties of the call. */
141 public int getProperties() { return mProperties; }
142
Bryce Leedd976b12015-11-17 12:31:53 -0800143 /** Bitmask of supported routes of the call */
144 public int getSupportedAudioRoutes() {
145 return mSupportedAudioRoutes;
146 }
147
Sailesh Nepal60437932014-04-05 16:44:55 -0700148 /** The time that the call switched to the active state. */
149 public long getConnectTimeMillis() {
150 return mConnectTimeMillis;
151 }
152
153 /** The endpoint to which the call is connected. */
154 public Uri getHandle() {
155 return mHandle;
156 }
157
Nancy Chen9d568c02014-09-08 14:17:59 -0700158 /**
Tyler Gunnef9f6f92014-09-12 22:16:17 -0700159 * The presentation requirements for the handle. See {@link TelecomManager} for valid values.
Nancy Chen9d568c02014-09-08 14:17:59 -0700160 */
Sailesh Nepal61203862014-07-11 14:50:13 -0700161 public int getHandlePresentation() {
162 return mHandlePresentation;
163 }
164
165 /** The endpoint to which the call is connected. */
166 public String getCallerDisplayName() {
167 return mCallerDisplayName;
168 }
169
Nancy Chen9d568c02014-09-08 14:17:59 -0700170 /**
171 * The presentation requirements for the caller display name.
Tyler Gunnef9f6f92014-09-12 22:16:17 -0700172 * See {@link TelecomManager} for valid values.
Nancy Chen9d568c02014-09-08 14:17:59 -0700173 */
Sailesh Nepal61203862014-07-11 14:50:13 -0700174 public int getCallerDisplayNamePresentation() {
175 return mCallerDisplayNamePresentation;
176 }
177
Sailesh Nepal60437932014-04-05 16:44:55 -0700178 /** Gateway information for the call. */
179 public GatewayInfo getGatewayInfo() {
180 return mGatewayInfo;
181 }
182
Evan Charlton6eb262c2014-07-19 18:18:19 -0700183 /** PhoneAccountHandle information for the call. */
Evan Charlton8c8a0622014-07-20 12:31:00 -0700184 public PhoneAccountHandle getAccountHandle() {
185 return mAccountHandle;
Nancy Chen5ffbfcc2014-06-25 14:22:55 -0700186 }
187
Sailesh Nepal60437932014-04-05 16:44:55 -0700188 /**
Andrew Lee50aca232014-07-22 16:41:54 -0700189 * Returns an object for remotely communicating through the video call provider's binder.
190 * @return The video call.
Andrew Lee5dc30752014-06-27 17:02:19 -0700191 */
Tyler Gunn45382162015-05-06 08:52:27 -0700192 public InCallService.VideoCall getVideoCall(Call call) {
Andrew Lee50aca232014-07-22 16:41:54 -0700193 if (mVideoCall == null && mVideoCallProvider != null) {
Andrew Lee5dc30752014-06-27 17:02:19 -0700194 try {
Tyler Gunn45382162015-05-06 08:52:27 -0700195 mVideoCall = new VideoCallImpl(mVideoCallProvider, call);
Andrew Lee5dc30752014-06-27 17:02:19 -0700196 } catch (RemoteException ignored) {
197 // Ignore RemoteException.
198 }
199 }
200
Andrew Lee50aca232014-07-22 16:41:54 -0700201 return mVideoCall;
Andrew Lee5dc30752014-06-27 17:02:19 -0700202 }
203
204 /**
Santos Cordon980acb92014-05-31 10:31:19 -0700205 * The conference call to which this call is conferenced. Null if not conferenced.
Santos Cordon980acb92014-05-31 10:31:19 -0700206 */
207 public String getParentCallId() {
208 return mParentCallId;
209 }
210
211 /**
212 * The child call-IDs if this call is a conference call. Returns an empty list if this is not
213 * a conference call or if the conference call contains no children.
Santos Cordon980acb92014-05-31 10:31:19 -0700214 */
215 public List<String> getChildCallIds() {
216 return mChildCallIds;
217 }
218
Santos Cordon7c7bc7f2014-07-28 18:15:48 -0700219 public List<String> getConferenceableCallIds() {
220 return mConferenceableCallIds;
221 }
222
Tyler Gunn8d83fa92014-07-01 11:31:21 -0700223 /**
Sailesh Nepale7ef59a2014-07-08 21:48:22 -0700224 * The status label and icon.
225 *
226 * @return Status hints.
227 */
228 public StatusHints getStatusHints() {
229 return mStatusHints;
230 }
231
Andrew Lee85f5d422014-07-11 17:22:03 -0700232 /**
233 * The video state.
234 * @return The video state of the call.
235 */
236 public int getVideoState() {
237 return mVideoState;
238 }
239
Nancy Chen10798dc2014-08-08 14:00:25 -0700240 /**
Santos Cordon6b7f9552015-05-27 17:21:45 -0700241 * Any extras associated with this call.
Nancy Chen10798dc2014-08-08 14:00:25 -0700242 *
243 * @return a bundle of extras
244 */
245 public Bundle getExtras() {
246 return mExtras;
247 }
248
Rekha Kumar07366812015-03-24 16:42:31 -0700249 /**
Santos Cordon6b7f9552015-05-27 17:21:45 -0700250 * Extras passed in as part of the original call intent.
251 *
252 * @return The intent extras.
253 */
254 public Bundle getIntentExtras() {
255 return mIntentExtras;
256 }
257
258 /**
Tyler Gunn75958422015-04-15 14:23:42 -0700259 * Indicates to the receiver of the {@link ParcelableCall} whether a change has occurred in the
260 * {@link android.telecom.InCallService.VideoCall} associated with this call. Since
261 * {@link #getVideoCall()} creates a new {@link VideoCallImpl}, it is useful to know whether
262 * the provider has changed (which can influence whether it is accessed).
263 *
264 * @return {@code true} if the video call changed, {@code false} otherwise.
265 */
266 public boolean isVideoCallProviderChanged() {
267 return mIsVideoCallProviderChanged;
268 }
269
Santos Cordon88b771d2014-07-19 13:10:40 -0700270 /** Responsible for creating ParcelableCall objects for deserialized Parcels. */
271 public static final Parcelable.Creator<ParcelableCall> CREATOR =
272 new Parcelable.Creator<ParcelableCall> () {
Sailesh Nepal60437932014-04-05 16:44:55 -0700273 @Override
Santos Cordon88b771d2014-07-19 13:10:40 -0700274 public ParcelableCall createFromParcel(Parcel source) {
275 ClassLoader classLoader = ParcelableCall.class.getClassLoader();
Sailesh Nepal60437932014-04-05 16:44:55 -0700276 String id = source.readString();
Ihab Awadb19a0bc2014-08-07 19:46:01 -0700277 int state = source.readInt();
Andrew Lee7f3d41f2014-09-11 17:33:16 -0700278 DisconnectCause disconnectCause = source.readParcelable(classLoader);
Ihab Awadc0677542014-06-10 13:29:47 -0700279 List<String> cannedSmsResponses = new ArrayList<>();
280 source.readList(cannedSmsResponses, classLoader);
Sailesh Nepal60437932014-04-05 16:44:55 -0700281 int capabilities = source.readInt();
Andrew Lee223ad142014-08-27 16:33:08 -0700282 int properties = source.readInt();
Sailesh Nepal60437932014-04-05 16:44:55 -0700283 long connectTimeMillis = source.readLong();
Sailesh Nepal60437932014-04-05 16:44:55 -0700284 Uri handle = source.readParcelable(classLoader);
Sailesh Nepal61203862014-07-11 14:50:13 -0700285 int handlePresentation = source.readInt();
286 String callerDisplayName = source.readString();
287 int callerDisplayNamePresentation = source.readInt();
Sailesh Nepal60437932014-04-05 16:44:55 -0700288 GatewayInfo gatewayInfo = source.readParcelable(classLoader);
Evan Charlton8c8a0622014-07-20 12:31:00 -0700289 PhoneAccountHandle accountHandle = source.readParcelable(classLoader);
Tyler Gunn75958422015-04-15 14:23:42 -0700290 boolean isVideoCallProviderChanged = source.readByte() == 1;
Ihab Awadb19a0bc2014-08-07 19:46:01 -0700291 IVideoProvider videoCallProvider =
292 IVideoProvider.Stub.asInterface(source.readStrongBinder());
Santos Cordon980acb92014-05-31 10:31:19 -0700293 String parentCallId = source.readString();
294 List<String> childCallIds = new ArrayList<>();
295 source.readList(childCallIds, classLoader);
Sailesh Nepale7ef59a2014-07-08 21:48:22 -0700296 StatusHints statusHints = source.readParcelable(classLoader);
Andrew Lee85f5d422014-07-11 17:22:03 -0700297 int videoState = source.readInt();
Santos Cordon7c7bc7f2014-07-28 18:15:48 -0700298 List<String> conferenceableCallIds = new ArrayList<>();
299 source.readList(conferenceableCallIds, classLoader);
Santos Cordon6b7f9552015-05-27 17:21:45 -0700300 Bundle intentExtras = source.readBundle(classLoader);
301 Bundle extras = source.readBundle(classLoader);
Bryce Leedd976b12015-11-17 12:31:53 -0800302 int supportedAudioRoutes = source.readInt();
Andrew Lee7f3d41f2014-09-11 17:33:16 -0700303 return new ParcelableCall(
304 id,
305 state,
306 disconnectCause,
307 cannedSmsResponses,
308 capabilities,
309 properties,
Bryce Leedd976b12015-11-17 12:31:53 -0800310 supportedAudioRoutes,
Andrew Lee7f3d41f2014-09-11 17:33:16 -0700311 connectTimeMillis,
312 handle,
313 handlePresentation,
314 callerDisplayName,
315 callerDisplayNamePresentation,
316 gatewayInfo,
317 accountHandle,
Tyler Gunn75958422015-04-15 14:23:42 -0700318 isVideoCallProviderChanged,
Andrew Lee7f3d41f2014-09-11 17:33:16 -0700319 videoCallProvider,
320 parentCallId,
321 childCallIds,
322 statusHints,
323 videoState,
324 conferenceableCallIds,
Santos Cordon6b7f9552015-05-27 17:21:45 -0700325 intentExtras,
Jay Shrauner8f988432015-04-16 12:52:19 -0700326 extras);
Sailesh Nepal60437932014-04-05 16:44:55 -0700327 }
328
329 @Override
Santos Cordon88b771d2014-07-19 13:10:40 -0700330 public ParcelableCall[] newArray(int size) {
331 return new ParcelableCall[size];
Sailesh Nepal60437932014-04-05 16:44:55 -0700332 }
333 };
334
335 /** {@inheritDoc} */
336 @Override
337 public int describeContents() {
338 return 0;
339 }
340
Santos Cordon88b771d2014-07-19 13:10:40 -0700341 /** Writes ParcelableCall object into a Parcel. */
Sailesh Nepal60437932014-04-05 16:44:55 -0700342 @Override
343 public void writeToParcel(Parcel destination, int flags) {
344 destination.writeString(mId);
Ihab Awadb19a0bc2014-08-07 19:46:01 -0700345 destination.writeInt(mState);
Andrew Lee7f3d41f2014-09-11 17:33:16 -0700346 destination.writeParcelable(mDisconnectCause, 0);
Ihab Awadc0677542014-06-10 13:29:47 -0700347 destination.writeList(mCannedSmsResponses);
Sailesh Nepal60437932014-04-05 16:44:55 -0700348 destination.writeInt(mCapabilities);
Andrew Lee223ad142014-08-27 16:33:08 -0700349 destination.writeInt(mProperties);
Sailesh Nepal60437932014-04-05 16:44:55 -0700350 destination.writeLong(mConnectTimeMillis);
351 destination.writeParcelable(mHandle, 0);
Sailesh Nepal61203862014-07-11 14:50:13 -0700352 destination.writeInt(mHandlePresentation);
353 destination.writeString(mCallerDisplayName);
354 destination.writeInt(mCallerDisplayNamePresentation);
Sailesh Nepal60437932014-04-05 16:44:55 -0700355 destination.writeParcelable(mGatewayInfo, 0);
Evan Charlton8c8a0622014-07-20 12:31:00 -0700356 destination.writeParcelable(mAccountHandle, 0);
Tyler Gunn75958422015-04-15 14:23:42 -0700357 destination.writeByte((byte) (mIsVideoCallProviderChanged ? 1 : 0));
Tyler Gunn807de8a2014-06-30 14:22:57 -0700358 destination.writeStrongBinder(
Andrew Lee50aca232014-07-22 16:41:54 -0700359 mVideoCallProvider != null ? mVideoCallProvider.asBinder() : null);
Santos Cordon980acb92014-05-31 10:31:19 -0700360 destination.writeString(mParentCallId);
361 destination.writeList(mChildCallIds);
Sailesh Nepale7ef59a2014-07-08 21:48:22 -0700362 destination.writeParcelable(mStatusHints, 0);
Andrew Lee85f5d422014-07-11 17:22:03 -0700363 destination.writeInt(mVideoState);
Santos Cordon7c7bc7f2014-07-28 18:15:48 -0700364 destination.writeList(mConferenceableCallIds);
Santos Cordon6b7f9552015-05-27 17:21:45 -0700365 destination.writeBundle(mIntentExtras);
366 destination.writeBundle(mExtras);
Bryce Leedd976b12015-11-17 12:31:53 -0800367 destination.writeInt(mSupportedAudioRoutes);
Sailesh Nepal60437932014-04-05 16:44:55 -0700368 }
Santos Cordonb6939982014-06-04 20:20:58 -0700369
370 @Override
371 public String toString() {
372 return String.format("[%s, parent:%s, children:%s]", mId, mParentCallId, mChildCallIds);
373 }
Sailesh Nepal60437932014-04-05 16:44:55 -0700374}