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