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;
23
24import com.android.internal.telecom.IVideoProvider;
25
26import java.util.ArrayList;
27import java.util.List;
28
29/**
30 * Information about a connection that is used between Telecom and the ConnectionService.
31 * This is used to send initial Connection information to Telecom when the connection is
32 * first created.
33 * @hide
34 */
35public final class ParcelableConnection implements Parcelable {
36    private final PhoneAccountHandle mPhoneAccount;
37    private final int mState;
38    private final int mConnectionCapabilities;
39    private final int mConnectionProperties;
40    private final int mSupportedAudioRoutes;
41    private final Uri mAddress;
42    private final int mAddressPresentation;
43    private final String mCallerDisplayName;
44    private final int mCallerDisplayNamePresentation;
45    private final IVideoProvider mVideoProvider;
46    private final int mVideoState;
47    private final boolean mRingbackRequested;
48    private final boolean mIsVoipAudioMode;
49    private final long mConnectTimeMillis;
50    private final long mConnectElapsedTimeMillis;
51    private final StatusHints mStatusHints;
52    private final DisconnectCause mDisconnectCause;
53    private final List<String> mConferenceableConnectionIds;
54    private final Bundle mExtras;
55    private String mParentCallId;
56
57    /** @hide */
58    public ParcelableConnection(
59            PhoneAccountHandle phoneAccount,
60            int state,
61            int capabilities,
62            int properties,
63            int supportedAudioRoutes,
64            Uri address,
65            int addressPresentation,
66            String callerDisplayName,
67            int callerDisplayNamePresentation,
68            IVideoProvider videoProvider,
69            int videoState,
70            boolean ringbackRequested,
71            boolean isVoipAudioMode,
72            long connectTimeMillis,
73            long connectElapsedTimeMillis,
74            StatusHints statusHints,
75            DisconnectCause disconnectCause,
76            List<String> conferenceableConnectionIds,
77            Bundle extras,
78            String parentCallId) {
79        this(phoneAccount, state, capabilities, properties, supportedAudioRoutes, address,
80                addressPresentation, callerDisplayName, callerDisplayNamePresentation,
81                videoProvider, videoState, ringbackRequested, isVoipAudioMode, connectTimeMillis,
82                connectElapsedTimeMillis, statusHints, disconnectCause, conferenceableConnectionIds,
83                extras);
84        mParentCallId = parentCallId;
85    }
86
87    /** @hide */
88    public ParcelableConnection(
89            PhoneAccountHandle phoneAccount,
90            int state,
91            int capabilities,
92            int properties,
93            int supportedAudioRoutes,
94            Uri address,
95            int addressPresentation,
96            String callerDisplayName,
97            int callerDisplayNamePresentation,
98            IVideoProvider videoProvider,
99            int videoState,
100            boolean ringbackRequested,
101            boolean isVoipAudioMode,
102            long connectTimeMillis,
103            long connectElapsedTimeMillis,
104            StatusHints statusHints,
105            DisconnectCause disconnectCause,
106            List<String> conferenceableConnectionIds,
107            Bundle extras) {
108        mPhoneAccount = phoneAccount;
109        mState = state;
110        mConnectionCapabilities = capabilities;
111        mConnectionProperties = properties;
112        mSupportedAudioRoutes = supportedAudioRoutes;
113        mAddress = address;
114        mAddressPresentation = addressPresentation;
115        mCallerDisplayName = callerDisplayName;
116        mCallerDisplayNamePresentation = callerDisplayNamePresentation;
117        mVideoProvider = videoProvider;
118        mVideoState = videoState;
119        mRingbackRequested = ringbackRequested;
120        mIsVoipAudioMode = isVoipAudioMode;
121        mConnectTimeMillis = connectTimeMillis;
122        mConnectElapsedTimeMillis = connectElapsedTimeMillis;
123        mStatusHints = statusHints;
124        mDisconnectCause = disconnectCause;
125        mConferenceableConnectionIds = conferenceableConnectionIds;
126        mExtras = extras;
127        mParentCallId = null;
128    }
129
130    public PhoneAccountHandle getPhoneAccount() {
131        return mPhoneAccount;
132    }
133
134    public int getState() {
135        return mState;
136    }
137
138    /**
139     * Returns the current connection capabilities bit-mask.  Connection capabilities are defined as
140     * {@code CAPABILITY_*} constants in {@link Connection}.
141     *
142     * @return Bit-mask containing capabilities of the connection.
143     */
144    public int getConnectionCapabilities() {
145        return mConnectionCapabilities;
146    }
147
148    /**
149     * Returns the current connection properties bit-mask.  Connection properties are defined as
150     * {@code PROPERTY_*} constants in {@link Connection}.
151     *
152     * @return Bit-mask containing properties of the connection.
153     */
154    public int getConnectionProperties() {
155        return mConnectionProperties;
156    }
157
158    public int getSupportedAudioRoutes() {
159        return mSupportedAudioRoutes;
160    }
161
162    public Uri getHandle() {
163        return mAddress;
164    }
165
166    public int getHandlePresentation() {
167        return mAddressPresentation;
168    }
169
170    public String getCallerDisplayName() {
171        return mCallerDisplayName;
172    }
173
174    public int getCallerDisplayNamePresentation() {
175        return mCallerDisplayNamePresentation;
176    }
177
178    public IVideoProvider getVideoProvider() {
179        return mVideoProvider;
180    }
181
182    public int getVideoState() {
183        return mVideoState;
184    }
185
186    public boolean isRingbackRequested() {
187        return mRingbackRequested;
188    }
189
190    public boolean getIsVoipAudioMode() {
191        return mIsVoipAudioMode;
192    }
193
194    public long getConnectTimeMillis() {
195        return mConnectTimeMillis;
196    }
197
198    public long getConnectElapsedTimeMillis() {
199        return mConnectElapsedTimeMillis;
200    }
201
202    public final StatusHints getStatusHints() {
203        return mStatusHints;
204    }
205
206    public final DisconnectCause getDisconnectCause() {
207        return mDisconnectCause;
208    }
209
210    public final List<String> getConferenceableConnectionIds() {
211        return mConferenceableConnectionIds;
212    }
213
214    public final Bundle getExtras() {
215        return mExtras;
216    }
217
218    public final String getParentCallId() {
219        return mParentCallId;
220    }
221
222    @Override
223    public String toString() {
224        return new StringBuilder()
225                .append("ParcelableConnection [act:")
226                .append(mPhoneAccount)
227                .append("], state:")
228                .append(mState)
229                .append(", capabilities:")
230                .append(Connection.capabilitiesToString(mConnectionCapabilities))
231                .append(", properties:")
232                .append(Connection.propertiesToString(mConnectionProperties))
233                .append(", extras:")
234                .append(mExtras)
235                .append(", parent:")
236                .append(mParentCallId)
237                .toString();
238    }
239
240    public static final Parcelable.Creator<ParcelableConnection> CREATOR =
241            new Parcelable.Creator<ParcelableConnection> () {
242        @Override
243        public ParcelableConnection createFromParcel(Parcel source) {
244            ClassLoader classLoader = ParcelableConnection.class.getClassLoader();
245
246            PhoneAccountHandle phoneAccount = source.readParcelable(classLoader);
247            int state = source.readInt();
248            int capabilities = source.readInt();
249            Uri address = source.readParcelable(classLoader);
250            int addressPresentation = source.readInt();
251            String callerDisplayName = source.readString();
252            int callerDisplayNamePresentation = source.readInt();
253            IVideoProvider videoCallProvider =
254                    IVideoProvider.Stub.asInterface(source.readStrongBinder());
255            int videoState = source.readInt();
256            boolean ringbackRequested = source.readByte() == 1;
257            boolean audioModeIsVoip = source.readByte() == 1;
258            long connectTimeMillis = source.readLong();
259            StatusHints statusHints = source.readParcelable(classLoader);
260            DisconnectCause disconnectCause = source.readParcelable(classLoader);
261            List<String> conferenceableConnectionIds = new ArrayList<>();
262            source.readStringList(conferenceableConnectionIds);
263            Bundle extras = Bundle.setDefusable(source.readBundle(classLoader), true);
264            int properties = source.readInt();
265            int supportedAudioRoutes = source.readInt();
266            String parentCallId = source.readString();
267            long connectElapsedTimeMillis = source.readLong();
268
269            return new ParcelableConnection(
270                    phoneAccount,
271                    state,
272                    capabilities,
273                    properties,
274                    supportedAudioRoutes,
275                    address,
276                    addressPresentation,
277                    callerDisplayName,
278                    callerDisplayNamePresentation,
279                    videoCallProvider,
280                    videoState,
281                    ringbackRequested,
282                    audioModeIsVoip,
283                    connectTimeMillis,
284                    connectElapsedTimeMillis,
285                    statusHints,
286                    disconnectCause,
287                    conferenceableConnectionIds,
288                    extras,
289                    parentCallId);
290        }
291
292        @Override
293        public ParcelableConnection[] newArray(int size) {
294            return new ParcelableConnection[size];
295        }
296    };
297
298    /** {@inheritDoc} */
299    @Override
300    public int describeContents() {
301        return 0;
302    }
303
304    /** Writes ParcelableConnection object into a Parcel. */
305    @Override
306    public void writeToParcel(Parcel destination, int flags) {
307        destination.writeParcelable(mPhoneAccount, 0);
308        destination.writeInt(mState);
309        destination.writeInt(mConnectionCapabilities);
310        destination.writeParcelable(mAddress, 0);
311        destination.writeInt(mAddressPresentation);
312        destination.writeString(mCallerDisplayName);
313        destination.writeInt(mCallerDisplayNamePresentation);
314        destination.writeStrongBinder(
315                mVideoProvider != null ? mVideoProvider.asBinder() : null);
316        destination.writeInt(mVideoState);
317        destination.writeByte((byte) (mRingbackRequested ? 1 : 0));
318        destination.writeByte((byte) (mIsVoipAudioMode ? 1 : 0));
319        destination.writeLong(mConnectTimeMillis);
320        destination.writeParcelable(mStatusHints, 0);
321        destination.writeParcelable(mDisconnectCause, 0);
322        destination.writeStringList(mConferenceableConnectionIds);
323        destination.writeBundle(mExtras);
324        destination.writeInt(mConnectionProperties);
325        destination.writeInt(mSupportedAudioRoutes);
326        destination.writeString(mParentCallId);
327        destination.writeLong(mConnectElapsedTimeMillis);
328    }
329}
330