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