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 boolean mIsVideoCallProviderChanged;
50     private final IVideoProvider mVideoCallProvider;
51     private InCallService.VideoCall 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 
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, boolean isVideoCallProviderChanged, IVideoProvider videoCallProvider, String parentCallId, List<String> childCallIds, StatusHints statusHints, int videoState, List<String> conferenceableCallIds, Bundle intentExtras, Bundle extras)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. */
getId()108     public String getId() {
109         return mId;
110     }
111 
112     /** The current state of the call. */
getState()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      */
getDisconnectCause()121     public DisconnectCause getDisconnectCause() {
122         return mDisconnectCause;
123     }
124 
125     /**
126      * The set of possible text message responses when this call is incoming.
127      */
getCannedSmsResponses()128     public List<String> getCannedSmsResponses() {
129         return mCannedSmsResponses;
130     }
131 
132     // Bit mask of actions a call supports, values are defined in {@link CallCapabilities}.
getCapabilities()133     public int getCapabilities() {
134         return mCapabilities;
135     }
136 
137     /** Bitmask of properties of the call. */
getProperties()138     public int getProperties() { return mProperties; }
139 
140     /** The time that the call switched to the active state. */
getConnectTimeMillis()141     public long getConnectTimeMillis() {
142         return mConnectTimeMillis;
143     }
144 
145     /** The endpoint to which the call is connected. */
getHandle()146     public Uri getHandle() {
147         return mHandle;
148     }
149 
150     /**
151      * The presentation requirements for the handle. See {@link TelecomManager} for valid values.
152      */
getHandlePresentation()153     public int getHandlePresentation() {
154         return mHandlePresentation;
155     }
156 
157     /** The endpoint to which the call is connected. */
getCallerDisplayName()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      */
getCallerDisplayNamePresentation()166     public int getCallerDisplayNamePresentation() {
167         return mCallerDisplayNamePresentation;
168     }
169 
170     /** Gateway information for the call. */
getGatewayInfo()171     public GatewayInfo getGatewayInfo() {
172         return mGatewayInfo;
173     }
174 
175     /** PhoneAccountHandle information for the call. */
getAccountHandle()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      * @return The video call.
183      */
getVideoCall(Call call)184     public InCallService.VideoCall getVideoCall(Call call) {
185         if (mVideoCall == null && mVideoCallProvider != null) {
186             try {
187                 mVideoCall = new VideoCallImpl(mVideoCallProvider, call);
188             } catch (RemoteException ignored) {
189                 // Ignore RemoteException.
190             }
191         }
192 
193         return mVideoCall;
194     }
195 
196     /**
197      * The conference call to which this call is conferenced. Null if not conferenced.
198      */
getParentCallId()199     public String getParentCallId() {
200         return mParentCallId;
201     }
202 
203     /**
204      * The child call-IDs if this call is a conference call. Returns an empty list if this is not
205      * a conference call or if the conference call contains no children.
206      */
getChildCallIds()207     public List<String> getChildCallIds() {
208         return mChildCallIds;
209     }
210 
getConferenceableCallIds()211     public List<String> getConferenceableCallIds() {
212         return mConferenceableCallIds;
213     }
214 
215     /**
216      * The status label and icon.
217      *
218      * @return Status hints.
219      */
getStatusHints()220     public StatusHints getStatusHints() {
221         return mStatusHints;
222     }
223 
224     /**
225      * The video state.
226      * @return The video state of the call.
227      */
getVideoState()228     public int getVideoState() {
229         return mVideoState;
230     }
231 
232     /**
233      * Any extras associated with this call.
234      *
235      * @return a bundle of extras
236      */
getExtras()237     public Bundle getExtras() {
238         return mExtras;
239     }
240 
241     /**
242      * Extras passed in as part of the original call intent.
243      *
244      * @return The intent extras.
245      */
getIntentExtras()246     public Bundle getIntentExtras() {
247         return mIntentExtras;
248     }
249 
250     /**
251      * Indicates to the receiver of the {@link ParcelableCall} whether a change has occurred in the
252      * {@link android.telecom.InCallService.VideoCall} associated with this call.  Since
253      * {@link #getVideoCall()} creates a new {@link VideoCallImpl}, it is useful to know whether
254      * the provider has changed (which can influence whether it is accessed).
255      *
256      * @return {@code true} if the video call changed, {@code false} otherwise.
257      */
isVideoCallProviderChanged()258     public boolean isVideoCallProviderChanged() {
259         return mIsVideoCallProviderChanged;
260     }
261 
262     /** Responsible for creating ParcelableCall objects for deserialized Parcels. */
263     public static final Parcelable.Creator<ParcelableCall> CREATOR =
264             new Parcelable.Creator<ParcelableCall> () {
265         @Override
266         public ParcelableCall createFromParcel(Parcel source) {
267             ClassLoader classLoader = ParcelableCall.class.getClassLoader();
268             String id = source.readString();
269             int state = source.readInt();
270             DisconnectCause disconnectCause = source.readParcelable(classLoader);
271             List<String> cannedSmsResponses = new ArrayList<>();
272             source.readList(cannedSmsResponses, classLoader);
273             int capabilities = source.readInt();
274             int properties = source.readInt();
275             long connectTimeMillis = source.readLong();
276             Uri handle = source.readParcelable(classLoader);
277             int handlePresentation = source.readInt();
278             String callerDisplayName = source.readString();
279             int callerDisplayNamePresentation = source.readInt();
280             GatewayInfo gatewayInfo = source.readParcelable(classLoader);
281             PhoneAccountHandle accountHandle = source.readParcelable(classLoader);
282             boolean isVideoCallProviderChanged = source.readByte() == 1;
283             IVideoProvider videoCallProvider =
284                     IVideoProvider.Stub.asInterface(source.readStrongBinder());
285             String parentCallId = source.readString();
286             List<String> childCallIds = new ArrayList<>();
287             source.readList(childCallIds, classLoader);
288             StatusHints statusHints = source.readParcelable(classLoader);
289             int videoState = source.readInt();
290             List<String> conferenceableCallIds = new ArrayList<>();
291             source.readList(conferenceableCallIds, classLoader);
292             Bundle intentExtras = source.readBundle(classLoader);
293             Bundle extras = source.readBundle(classLoader);
294             return new ParcelableCall(
295                     id,
296                     state,
297                     disconnectCause,
298                     cannedSmsResponses,
299                     capabilities,
300                     properties,
301                     connectTimeMillis,
302                     handle,
303                     handlePresentation,
304                     callerDisplayName,
305                     callerDisplayNamePresentation,
306                     gatewayInfo,
307                     accountHandle,
308                     isVideoCallProviderChanged,
309                     videoCallProvider,
310                     parentCallId,
311                     childCallIds,
312                     statusHints,
313                     videoState,
314                     conferenceableCallIds,
315                     intentExtras,
316                     extras);
317         }
318 
319         @Override
320         public ParcelableCall[] newArray(int size) {
321             return new ParcelableCall[size];
322         }
323     };
324 
325     /** {@inheritDoc} */
326     @Override
describeContents()327     public int describeContents() {
328         return 0;
329     }
330 
331     /** Writes ParcelableCall object into a Parcel. */
332     @Override
writeToParcel(Parcel destination, int flags)333     public void writeToParcel(Parcel destination, int flags) {
334         destination.writeString(mId);
335         destination.writeInt(mState);
336         destination.writeParcelable(mDisconnectCause, 0);
337         destination.writeList(mCannedSmsResponses);
338         destination.writeInt(mCapabilities);
339         destination.writeInt(mProperties);
340         destination.writeLong(mConnectTimeMillis);
341         destination.writeParcelable(mHandle, 0);
342         destination.writeInt(mHandlePresentation);
343         destination.writeString(mCallerDisplayName);
344         destination.writeInt(mCallerDisplayNamePresentation);
345         destination.writeParcelable(mGatewayInfo, 0);
346         destination.writeParcelable(mAccountHandle, 0);
347         destination.writeByte((byte) (mIsVideoCallProviderChanged ? 1 : 0));
348         destination.writeStrongBinder(
349                 mVideoCallProvider != null ? mVideoCallProvider.asBinder() : null);
350         destination.writeString(mParentCallId);
351         destination.writeList(mChildCallIds);
352         destination.writeParcelable(mStatusHints, 0);
353         destination.writeInt(mVideoState);
354         destination.writeList(mConferenceableCallIds);
355         destination.writeBundle(mIntentExtras);
356         destination.writeBundle(mExtras);
357     }
358 
359     @Override
toString()360     public String toString() {
361         return String.format("[%s, parent:%s, children:%s]", mId, mParentCallId, mChildCallIds);
362     }
363 }
364