1 /* 2 * Copyright (C) 2006 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 com.android.internal.telephony; 18 19 import android.net.Uri; 20 import android.os.Bundle; 21 import android.os.SystemClock; 22 import android.telecom.ConferenceParticipant; 23 import android.telephony.DisconnectCause; 24 import android.telephony.Rlog; 25 import android.util.Log; 26 27 import java.lang.Override; 28 import java.util.ArrayList; 29 import java.util.List; 30 import java.util.Set; 31 import java.util.concurrent.CopyOnWriteArraySet; 32 33 /** 34 * {@hide} 35 */ 36 public abstract class Connection { 37 38 public interface PostDialListener { onPostDialWait()39 void onPostDialWait(); onPostDialChar(char c)40 void onPostDialChar(char c); 41 } 42 43 /** 44 * Capabilities that will be mapped to telecom connection 45 * capabilities. 46 */ 47 public static class Capability { 48 49 /** 50 * For an IMS video call, indicates that the local side of the call supports downgrading 51 * from a video call to an audio-only call. 52 */ 53 public static final int SUPPORTS_DOWNGRADE_TO_VOICE_LOCAL = 0x00000001; 54 55 /** 56 * For an IMS video call, indicates that the peer supports downgrading to an audio-only 57 * call. 58 */ 59 public static final int SUPPORTS_DOWNGRADE_TO_VOICE_REMOTE = 0x00000002; 60 61 /** 62 * For an IMS call, indicates that the call supports video locally. 63 */ 64 public static final int SUPPORTS_VT_LOCAL_BIDIRECTIONAL = 0x00000004; 65 66 /** 67 * For an IMS call, indicates that the peer supports video. 68 */ 69 public static final int SUPPORTS_VT_REMOTE_BIDIRECTIONAL = 0x00000008; 70 71 /** 72 * Indicates that the connection is an external connection (e.g. an instance of the class 73 * {@link com.android.internal.telephony.imsphone.ImsExternalConnection}. 74 */ 75 public static final int IS_EXTERNAL_CONNECTION = 0x00000010; 76 77 /** 78 * Indicates that this external connection can be pulled from the remote device to the 79 * local device. 80 */ 81 public static final int IS_PULLABLE = 0x00000020; 82 } 83 84 /** 85 * Listener interface for events related to the connection which should be reported to the 86 * {@link android.telecom.Connection}. 87 */ 88 public interface Listener { onVideoStateChanged(int videoState)89 public void onVideoStateChanged(int videoState); onConnectionCapabilitiesChanged(int capability)90 public void onConnectionCapabilitiesChanged(int capability); onWifiChanged(boolean isWifi)91 public void onWifiChanged(boolean isWifi); onVideoProviderChanged( android.telecom.Connection.VideoProvider videoProvider)92 public void onVideoProviderChanged( 93 android.telecom.Connection.VideoProvider videoProvider); onAudioQualityChanged(int audioQuality)94 public void onAudioQualityChanged(int audioQuality); onConferenceParticipantsChanged(List<ConferenceParticipant> participants)95 public void onConferenceParticipantsChanged(List<ConferenceParticipant> participants); onCallSubstateChanged(int callSubstate)96 public void onCallSubstateChanged(int callSubstate); onMultipartyStateChanged(boolean isMultiParty)97 public void onMultipartyStateChanged(boolean isMultiParty); onConferenceMergedFailed()98 public void onConferenceMergedFailed(); onExtrasChanged(Bundle extras)99 public void onExtrasChanged(Bundle extras); onExitedEcmMode()100 public void onExitedEcmMode(); onCallPullFailed(Connection externalConnection)101 public void onCallPullFailed(Connection externalConnection); onHandoverToWifiFailed()102 public void onHandoverToWifiFailed(); onConnectionEvent(String event, Bundle extras)103 public void onConnectionEvent(String event, Bundle extras); 104 } 105 106 /** 107 * Base listener implementation. 108 */ 109 public abstract static class ListenerBase implements Listener { 110 @Override onVideoStateChanged(int videoState)111 public void onVideoStateChanged(int videoState) {} 112 @Override onConnectionCapabilitiesChanged(int capability)113 public void onConnectionCapabilitiesChanged(int capability) {} 114 @Override onWifiChanged(boolean isWifi)115 public void onWifiChanged(boolean isWifi) {} 116 @Override onVideoProviderChanged( android.telecom.Connection.VideoProvider videoProvider)117 public void onVideoProviderChanged( 118 android.telecom.Connection.VideoProvider videoProvider) {} 119 @Override onAudioQualityChanged(int audioQuality)120 public void onAudioQualityChanged(int audioQuality) {} 121 @Override onConferenceParticipantsChanged(List<ConferenceParticipant> participants)122 public void onConferenceParticipantsChanged(List<ConferenceParticipant> participants) {} 123 @Override onCallSubstateChanged(int callSubstate)124 public void onCallSubstateChanged(int callSubstate) {} 125 @Override onMultipartyStateChanged(boolean isMultiParty)126 public void onMultipartyStateChanged(boolean isMultiParty) {} 127 @Override onConferenceMergedFailed()128 public void onConferenceMergedFailed() {} 129 @Override onExtrasChanged(Bundle extras)130 public void onExtrasChanged(Bundle extras) {} 131 @Override onExitedEcmMode()132 public void onExitedEcmMode() {} 133 @Override onCallPullFailed(Connection externalConnection)134 public void onCallPullFailed(Connection externalConnection) {} 135 @Override onHandoverToWifiFailed()136 public void onHandoverToWifiFailed() {} 137 @Override onConnectionEvent(String event, Bundle extras)138 public void onConnectionEvent(String event, Bundle extras) {} 139 } 140 141 public static final int AUDIO_QUALITY_STANDARD = 1; 142 public static final int AUDIO_QUALITY_HIGH_DEFINITION = 2; 143 144 /** 145 * The telecom internal call ID associated with this connection. Only to be used for debugging 146 * purposes. 147 */ 148 private String mTelecomCallId; 149 150 //Caller Name Display 151 protected String mCnapName; 152 protected int mCnapNamePresentation = PhoneConstants.PRESENTATION_ALLOWED; 153 protected String mAddress; // MAY BE NULL!!! 154 protected String mDialString; // outgoing calls only 155 protected int mNumberPresentation = PhoneConstants.PRESENTATION_ALLOWED; 156 protected boolean mIsIncoming; 157 /* 158 * These time/timespan values are based on System.currentTimeMillis(), 159 * i.e., "wall clock" time. 160 */ 161 protected long mCreateTime; 162 protected long mConnectTime; 163 /* 164 * These time/timespan values are based on SystemClock.elapsedRealTime(), 165 * i.e., time since boot. They are appropriate for comparison and 166 * calculating deltas. 167 */ 168 protected long mConnectTimeReal; 169 protected long mDuration; 170 protected long mHoldingStartTime; // The time when the Connection last transitioned 171 // into HOLDING 172 protected Connection mOrigConnection; 173 private List<PostDialListener> mPostDialListeners = new ArrayList<>(); 174 public Set<Listener> mListeners = new CopyOnWriteArraySet<>(); 175 176 protected boolean mNumberConverted = false; 177 protected String mConvertedNumber; 178 179 protected String mPostDialString; // outgoing calls only 180 protected int mNextPostDialChar; // index into postDialString 181 182 protected int mCause = DisconnectCause.NOT_DISCONNECTED; 183 protected PostDialState mPostDialState = PostDialState.NOT_STARTED; 184 185 private static String LOG_TAG = "Connection"; 186 187 Object mUserData; 188 private int mVideoState; 189 private int mConnectionCapabilities; 190 private boolean mIsWifi; 191 private int mAudioQuality; 192 private int mCallSubstate; 193 private android.telecom.Connection.VideoProvider mVideoProvider; 194 public Call.State mPreHandoverState = Call.State.IDLE; 195 private Bundle mExtras; 196 private int mPhoneType; 197 private boolean mAnsweringDisconnectsActiveCall; 198 private boolean mAllowAddCallDuringVideoCall; 199 200 /** 201 * Used to indicate that this originated from pulling a {@link android.telecom.Connection} with 202 * {@link android.telecom.Connection#PROPERTY_IS_EXTERNAL_CALL}. 203 */ 204 private boolean mIsPulledCall = false; 205 206 /** 207 * Where {@link #mIsPulledCall} is {@code true}, contains the dialog Id of the external call 208 * which is being pulled (e.g. 209 * {@link com.android.internal.telephony.imsphone.ImsExternalConnection#getCallId()}). 210 */ 211 private int mPulledDialogId; 212 Connection(int phoneType)213 protected Connection(int phoneType) { 214 mPhoneType = phoneType; 215 } 216 217 /* Instance Methods */ 218 219 /** 220 * @return The telecom internal call ID associated with this connection. Only to be used for 221 * debugging purposes. 222 */ getTelecomCallId()223 public String getTelecomCallId() { 224 return mTelecomCallId; 225 } 226 227 /** 228 * Sets the telecom call ID associated with this connection. 229 * 230 * @param telecomCallId The telecom call ID. 231 */ setTelecomCallId(String telecomCallId)232 public void setTelecomCallId(String telecomCallId) { 233 mTelecomCallId = telecomCallId; 234 } 235 236 /** 237 * Gets address (e.g. phone number) associated with connection. 238 * TODO: distinguish reasons for unavailability 239 * 240 * @return address or null if unavailable 241 */ 242 getAddress()243 public String getAddress() { 244 return mAddress; 245 } 246 247 /** 248 * Gets CNAP name associated with connection. 249 * @return cnap name or null if unavailable 250 */ getCnapName()251 public String getCnapName() { 252 return mCnapName; 253 } 254 255 /** 256 * Get original dial string. 257 * @return original dial string or null if unavailable 258 */ getOrigDialString()259 public String getOrigDialString(){ 260 return null; 261 } 262 263 /** 264 * Gets CNAP presentation associated with connection. 265 * @return cnap name or null if unavailable 266 */ 267 getCnapNamePresentation()268 public int getCnapNamePresentation() { 269 return mCnapNamePresentation; 270 } 271 272 /** 273 * @return Call that owns this Connection, or null if none 274 */ getCall()275 public abstract Call getCall(); 276 277 /** 278 * Connection create time in currentTimeMillis() format 279 * Basically, set when object is created. 280 * Effectively, when an incoming call starts ringing or an 281 * outgoing call starts dialing 282 */ getCreateTime()283 public long getCreateTime() { 284 return mCreateTime; 285 } 286 287 /** 288 * Connection connect time in currentTimeMillis() format. 289 * For outgoing calls: Begins at (DIALING|ALERTING) -> ACTIVE transition. 290 * For incoming calls: Begins at (INCOMING|WAITING) -> ACTIVE transition. 291 * Returns 0 before then. 292 */ getConnectTime()293 public long getConnectTime() { 294 return mConnectTime; 295 } 296 297 /** 298 * Sets the Connection connect time in currentTimeMillis() format. 299 * 300 * @param connectTime the new connect time. 301 */ setConnectTime(long connectTime)302 public void setConnectTime(long connectTime) { 303 mConnectTime = connectTime; 304 } 305 306 /** 307 * Connection connect time in elapsedRealtime() format. 308 * For outgoing calls: Begins at (DIALING|ALERTING) -> ACTIVE transition. 309 * For incoming calls: Begins at (INCOMING|WAITING) -> ACTIVE transition. 310 * Returns 0 before then. 311 */ getConnectTimeReal()312 public long getConnectTimeReal() { 313 return mConnectTimeReal; 314 } 315 316 /** 317 * Disconnect time in currentTimeMillis() format. 318 * The time when this Connection makes a transition into ENDED or FAIL. 319 * Returns 0 before then. 320 */ getDisconnectTime()321 public abstract long getDisconnectTime(); 322 323 /** 324 * Returns the number of milliseconds the call has been connected, 325 * or 0 if the call has never connected. 326 * If the call is still connected, then returns the elapsed 327 * time since connect. 328 */ getDurationMillis()329 public long getDurationMillis() { 330 if (mConnectTimeReal == 0) { 331 return 0; 332 } else if (mDuration == 0) { 333 return SystemClock.elapsedRealtime() - mConnectTimeReal; 334 } else { 335 return mDuration; 336 } 337 } 338 339 /** 340 * The time when this Connection last transitioned into HOLDING 341 * in elapsedRealtime() format. 342 * Returns 0, if it has never made a transition into HOLDING. 343 */ getHoldingStartTime()344 public long getHoldingStartTime() { 345 return mHoldingStartTime; 346 } 347 348 /** 349 * If this connection is HOLDING, return the number of milliseconds 350 * that it has been on hold for (approximately). 351 * If this connection is in any other state, return 0. 352 */ 353 getHoldDurationMillis()354 public abstract long getHoldDurationMillis(); 355 356 /** 357 * Returns call disconnect cause. Values are defined in 358 * {@link android.telephony.DisconnectCause}. If the call is not yet 359 * disconnected, NOT_DISCONNECTED is returned. 360 */ getDisconnectCause()361 public int getDisconnectCause() { 362 return mCause; 363 } 364 365 /** 366 * Returns a string disconnect cause which is from vendor. 367 * Vendors may use this string to explain the underline causes of failed calls. 368 * There is no guarantee that it is non-null nor it'll have meaningful stable values. 369 * Only use it when getDisconnectCause() returns a value that is not specific enough, like 370 * ERROR_UNSPECIFIED. 371 */ getVendorDisconnectCause()372 public abstract String getVendorDisconnectCause(); 373 374 /** 375 * Returns true of this connection originated elsewhere 376 * ("MT" or mobile terminated; another party called this terminal) 377 * or false if this call originated here (MO or mobile originated). 378 */ isIncoming()379 public boolean isIncoming() { 380 return mIsIncoming; 381 } 382 383 /** 384 * If this Connection is connected, then it is associated with 385 * a Call. 386 * 387 * Returns getCall().getState() or Call.State.IDLE if not 388 * connected 389 */ getState()390 public Call.State getState() { 391 Call c; 392 393 c = getCall(); 394 395 if (c == null) { 396 return Call.State.IDLE; 397 } else { 398 return c.getState(); 399 } 400 } 401 402 /** 403 * If this connection went through handover return the state of the 404 * call that contained this connection before handover. 405 */ getStateBeforeHandover()406 public Call.State getStateBeforeHandover() { 407 return mPreHandoverState; 408 } 409 410 /** 411 * Get the details of conference participants. Expected to be 412 * overwritten by the Connection subclasses. 413 */ getConferenceParticipants()414 public List<ConferenceParticipant> getConferenceParticipants() { 415 Call c; 416 417 c = getCall(); 418 419 if (c == null) { 420 return null; 421 } else { 422 return c.getConferenceParticipants(); 423 } 424 } 425 426 /** 427 * isAlive() 428 * 429 * @return true if the connection isn't disconnected 430 * (could be active, holding, ringing, dialing, etc) 431 */ 432 public boolean isAlive()433 isAlive() { 434 return getState().isAlive(); 435 } 436 437 /** 438 * Returns true if Connection is connected and is INCOMING or WAITING 439 */ 440 public boolean isRinging()441 isRinging() { 442 return getState().isRinging(); 443 } 444 445 /** 446 * 447 * @return the userdata set in setUserData() 448 */ getUserData()449 public Object getUserData() { 450 return mUserData; 451 } 452 453 /** 454 * 455 * @param userdata user can store an any userdata in the Connection object. 456 */ setUserData(Object userdata)457 public void setUserData(Object userdata) { 458 mUserData = userdata; 459 } 460 461 /** 462 * Hangup individual Connection 463 */ hangup()464 public abstract void hangup() throws CallStateException; 465 466 /** 467 * Separate this call from its owner Call and assigns it to a new Call 468 * (eg if it is currently part of a Conference call 469 * TODO: Throw exception? Does GSM require error display on failure here? 470 */ separate()471 public abstract void separate() throws CallStateException; 472 473 public enum PostDialState { 474 NOT_STARTED, /* The post dial string playback hasn't 475 been started, or this call is not yet 476 connected, or this is an incoming call */ 477 STARTED, /* The post dial string playback has begun */ 478 WAIT, /* The post dial string playback is waiting for a 479 call to proceedAfterWaitChar() */ 480 WILD, /* The post dial string playback is waiting for a 481 call to proceedAfterWildChar() */ 482 COMPLETE, /* The post dial string playback is complete */ 483 CANCELLED, /* The post dial string playback was cancelled 484 with cancelPostDial() */ 485 PAUSE /* The post dial string playback is pausing for a 486 call to processNextPostDialChar*/ 487 } 488 clearUserData()489 public void clearUserData(){ 490 mUserData = null; 491 } 492 addPostDialListener(PostDialListener listener)493 public final void addPostDialListener(PostDialListener listener) { 494 if (!mPostDialListeners.contains(listener)) { 495 mPostDialListeners.add(listener); 496 } 497 } 498 removePostDialListener(PostDialListener listener)499 public final void removePostDialListener(PostDialListener listener) { 500 mPostDialListeners.remove(listener); 501 } 502 clearPostDialListeners()503 protected final void clearPostDialListeners() { 504 mPostDialListeners.clear(); 505 } 506 notifyPostDialListeners()507 protected final void notifyPostDialListeners() { 508 if (getPostDialState() == PostDialState.WAIT) { 509 for (PostDialListener listener : new ArrayList<>(mPostDialListeners)) { 510 listener.onPostDialWait(); 511 } 512 } 513 } 514 notifyPostDialListenersNextChar(char c)515 protected final void notifyPostDialListenersNextChar(char c) { 516 for (PostDialListener listener : new ArrayList<>(mPostDialListeners)) { 517 listener.onPostDialChar(c); 518 } 519 } 520 getPostDialState()521 public PostDialState getPostDialState() { 522 return mPostDialState; 523 } 524 525 /** 526 * Returns the portion of the post dial string that has not 527 * yet been dialed, or "" if none 528 */ getRemainingPostDialString()529 public String getRemainingPostDialString() { 530 if (mPostDialState == PostDialState.CANCELLED 531 || mPostDialState == PostDialState.COMPLETE 532 || mPostDialString == null 533 || mPostDialString.length() <= mNextPostDialChar) { 534 return ""; 535 } 536 537 return mPostDialString.substring(mNextPostDialChar); 538 } 539 540 /** 541 * See Phone.setOnPostDialWaitCharacter() 542 */ 543 proceedAfterWaitChar()544 public abstract void proceedAfterWaitChar(); 545 546 /** 547 * See Phone.setOnPostDialWildCharacter() 548 */ proceedAfterWildChar(String str)549 public abstract void proceedAfterWildChar(String str); 550 /** 551 * Cancel any post 552 */ cancelPostDial()553 public abstract void cancelPostDial(); 554 555 /** Called when the connection has been disconnected */ onDisconnect(int cause)556 public boolean onDisconnect(int cause) { 557 return false; 558 } 559 560 /** 561 * Returns the caller id presentation type for incoming and waiting calls 562 * @return one of PRESENTATION_* 563 */ getNumberPresentation()564 public abstract int getNumberPresentation(); 565 566 /** 567 * Returns the User to User Signaling (UUS) information associated with 568 * incoming and waiting calls 569 * @return UUSInfo containing the UUS userdata. 570 */ getUUSInfo()571 public abstract UUSInfo getUUSInfo(); 572 573 /** 574 * Returns the CallFail reason provided by the RIL with the result of 575 * RIL_REQUEST_LAST_CALL_FAIL_CAUSE 576 */ getPreciseDisconnectCause()577 public abstract int getPreciseDisconnectCause(); 578 579 /** 580 * Returns the original Connection instance associated with 581 * this Connection 582 */ getOrigConnection()583 public Connection getOrigConnection() { 584 return mOrigConnection; 585 } 586 587 /** 588 * Returns whether the original ImsPhoneConnection was a member 589 * of a conference call 590 * @return valid only when getOrigConnection() is not null 591 */ isMultiparty()592 public abstract boolean isMultiparty(); 593 594 /** 595 * Applicable only for IMS Call. Determines if this call is the origin of the conference call 596 * (i.e. {@code #isConferenceHost()} is {@code true}), or if it is a member of a conference 597 * hosted on another device. 598 * 599 * @return {@code true} if this call is the origin of the conference call it is a member of, 600 * {@code false} otherwise. 601 */ isConferenceHost()602 public boolean isConferenceHost() { 603 return false; 604 } 605 606 /** 607 * Applicable only for IMS Call. Determines if a connection is a member of a conference hosted 608 * on another device. 609 * 610 * @return {@code true} if the connection is a member of a conference hosted on another device. 611 */ isMemberOfPeerConference()612 public boolean isMemberOfPeerConference() { 613 return false; 614 } 615 migrateFrom(Connection c)616 public void migrateFrom(Connection c) { 617 if (c == null) return; 618 mListeners = c.mListeners; 619 mDialString = c.getOrigDialString(); 620 mCreateTime = c.getCreateTime(); 621 mConnectTime = c.getConnectTime(); 622 mConnectTimeReal = c.getConnectTimeReal(); 623 mHoldingStartTime = c.getHoldingStartTime(); 624 mOrigConnection = c.getOrigConnection(); 625 mPostDialString = c.mPostDialString; 626 mNextPostDialChar = c.mNextPostDialChar; 627 } 628 629 /** 630 * Assign a listener to be notified of state changes. 631 * 632 * @param listener A listener. 633 */ addListener(Listener listener)634 public final void addListener(Listener listener) { 635 mListeners.add(listener); 636 } 637 638 /** 639 * Removes a listener. 640 * 641 * @param listener A listener. 642 */ removeListener(Listener listener)643 public final void removeListener(Listener listener) { 644 mListeners.remove(listener); 645 } 646 647 /** 648 * Returns the current video state of the connection. 649 * 650 * @return The video state of the connection. 651 */ getVideoState()652 public int getVideoState() { 653 return mVideoState; 654 } 655 656 /** 657 * Called to get Connection capabilities.Returns Capabilities bitmask. 658 * @See Connection.Capability. 659 */ getConnectionCapabilities()660 public int getConnectionCapabilities() { 661 return mConnectionCapabilities; 662 } 663 664 /** 665 * @return {@code} true if the connection has the specified capabilities. 666 */ hasCapabilities(int connectionCapabilities)667 public boolean hasCapabilities(int connectionCapabilities) { 668 return (mConnectionCapabilities & connectionCapabilities) == connectionCapabilities; 669 } 670 671 /** 672 * Applies a capability to a capabilities bit-mask. 673 * 674 * @param capabilities The capabilities bit-mask. 675 * @param capability The capability to apply. 676 * @return The capabilities bit-mask with the capability applied. 677 */ addCapability(int capabilities, int capability)678 public static int addCapability(int capabilities, int capability) { 679 return capabilities | capability; 680 } 681 682 /** 683 * Removes a capability to a capabilities bit-mask. 684 * 685 * @param capabilities The capabilities bit-mask. 686 * @param capability The capability to remove. 687 * @return The capabilities bit-mask with the capability removed. 688 */ removeCapability(int capabilities, int capability)689 public static int removeCapability(int capabilities, int capability) { 690 return capabilities & ~capability; 691 } 692 693 /** 694 * Returns whether the connection is using a wifi network. 695 * 696 * @return {@code True} if the connection is using a wifi network. 697 */ isWifi()698 public boolean isWifi() { 699 return mIsWifi; 700 } 701 702 /** 703 * Returns the {@link android.telecom.Connection.VideoProvider} for the connection. 704 * 705 * @return The {@link android.telecom.Connection.VideoProvider}. 706 */ getVideoProvider()707 public android.telecom.Connection.VideoProvider getVideoProvider() { 708 return mVideoProvider; 709 } 710 711 /** 712 * Returns the audio-quality for the connection. 713 * 714 * @return The audio quality for the connection. 715 */ getAudioQuality()716 public int getAudioQuality() { 717 return mAudioQuality; 718 } 719 720 721 /** 722 * Returns the current call substate of the connection. 723 * 724 * @return The call substate of the connection. 725 */ getCallSubstate()726 public int getCallSubstate() { 727 return mCallSubstate; 728 } 729 730 731 /** 732 * Sets the videoState for the current connection and reports the changes to all listeners. 733 * Valid video states are defined in {@link android.telecom.VideoProfile}. 734 * 735 * @return The video state. 736 */ setVideoState(int videoState)737 public void setVideoState(int videoState) { 738 mVideoState = videoState; 739 for (Listener l : mListeners) { 740 l.onVideoStateChanged(mVideoState); 741 } 742 } 743 744 /** 745 * Called to set Connection capabilities. This will take Capabilities bitmask as input which is 746 * converted from Capabilities constants. 747 * 748 * @See Connection.Capability. 749 * @param capabilities The Capabilities bitmask. 750 */ setConnectionCapabilities(int capabilities)751 public void setConnectionCapabilities(int capabilities) { 752 if (mConnectionCapabilities != capabilities) { 753 mConnectionCapabilities = capabilities; 754 for (Listener l : mListeners) { 755 l.onConnectionCapabilitiesChanged(mConnectionCapabilities); 756 } 757 } 758 } 759 760 /** 761 * Sets whether a wifi network is used for the connection. 762 * 763 * @param isWifi {@code True} if wifi is being used. 764 */ setWifi(boolean isWifi)765 public void setWifi(boolean isWifi) { 766 mIsWifi = isWifi; 767 for (Listener l : mListeners) { 768 l.onWifiChanged(mIsWifi); 769 } 770 } 771 772 /** 773 * Set the audio quality for the connection. 774 * 775 * @param audioQuality The audio quality. 776 */ setAudioQuality(int audioQuality)777 public void setAudioQuality(int audioQuality) { 778 mAudioQuality = audioQuality; 779 for (Listener l : mListeners) { 780 l.onAudioQualityChanged(mAudioQuality); 781 } 782 } 783 784 /** 785 * Notifies listeners that connection extras has changed. 786 * @param extras New connection extras. This Bundle will be cloned to ensure that any concurrent 787 * modifications to the extras Bundle do not affect Bundle operations in the onExtrasChanged 788 * listeners. 789 */ setConnectionExtras(Bundle extras)790 public void setConnectionExtras(Bundle extras) { 791 if (extras != null) { 792 mExtras = new Bundle(extras); 793 } else { 794 mExtras = null; 795 } 796 797 for (Listener l : mListeners) { 798 l.onExtrasChanged(mExtras); 799 } 800 } 801 802 /** 803 * Retrieves the current connection extras. 804 * @return the connection extras. 805 */ getConnectionExtras()806 public Bundle getConnectionExtras() { 807 return mExtras == null ? null : new Bundle(mExtras); 808 } 809 810 /** 811 * @return {@code true} if answering the call will cause the current active call to be 812 * disconnected, {@code false} otherwise. 813 */ isActiveCallDisconnectedOnAnswer()814 public boolean isActiveCallDisconnectedOnAnswer() { 815 return mAnsweringDisconnectsActiveCall; 816 } 817 818 /** 819 * Sets whether answering this call will cause the active call to be disconnected. 820 * <p> 821 * Should only be set {@code true} if there is an active call and this call is ringing. 822 * 823 * @param answeringDisconnectsActiveCall {@code true} if answering the call will call the active 824 * call to be disconnected. 825 */ setActiveCallDisconnectedOnAnswer(boolean answeringDisconnectsActiveCall)826 public void setActiveCallDisconnectedOnAnswer(boolean answeringDisconnectsActiveCall) { 827 mAnsweringDisconnectsActiveCall = answeringDisconnectsActiveCall; 828 } 829 shouldAllowAddCallDuringVideoCall()830 public boolean shouldAllowAddCallDuringVideoCall() { 831 return mAllowAddCallDuringVideoCall; 832 } 833 setAllowAddCallDuringVideoCall(boolean allowAddCallDuringVideoCall)834 public void setAllowAddCallDuringVideoCall(boolean allowAddCallDuringVideoCall) { 835 mAllowAddCallDuringVideoCall = allowAddCallDuringVideoCall; 836 } 837 838 /** 839 * Sets whether the connection is the result of an external call which was pulled to the local 840 * device. 841 * 842 * @param isPulledCall {@code true} if this connection is the result of pulling an external call 843 * to the local device. 844 */ setIsPulledCall(boolean isPulledCall)845 public void setIsPulledCall(boolean isPulledCall) { 846 mIsPulledCall = isPulledCall; 847 } 848 isPulledCall()849 public boolean isPulledCall() { 850 return mIsPulledCall; 851 } 852 853 /** 854 * For an external call which is being pulled (e.g. {@link #isPulledCall()} is {@code true}), 855 * sets the dialog Id for the external call. Used to handle failures to pull a call so that the 856 * pulled call can be reconciled with its original external connection. 857 * 858 * @param pulledDialogId The dialog id associated with a pulled call. 859 */ setPulledDialogId(int pulledDialogId)860 public void setPulledDialogId(int pulledDialogId) { 861 mPulledDialogId = pulledDialogId; 862 } 863 getPulledDialogId()864 public int getPulledDialogId() { 865 return mPulledDialogId; 866 } 867 868 /** 869 * Sets the call substate for the current connection and reports the changes to all listeners. 870 * Valid call substates are defined in {@link android.telecom.Connection}. 871 * 872 * @return The call substate. 873 */ setCallSubstate(int callSubstate)874 public void setCallSubstate(int callSubstate) { 875 mCallSubstate = callSubstate; 876 for (Listener l : mListeners) { 877 l.onCallSubstateChanged(mCallSubstate); 878 } 879 } 880 881 /** 882 * Sets the {@link android.telecom.Connection.VideoProvider} for the connection. 883 * 884 * @param videoProvider The video call provider. 885 */ setVideoProvider(android.telecom.Connection.VideoProvider videoProvider)886 public void setVideoProvider(android.telecom.Connection.VideoProvider videoProvider) { 887 mVideoProvider = videoProvider; 888 for (Listener l : mListeners) { 889 l.onVideoProviderChanged(mVideoProvider); 890 } 891 } 892 setConverted(String oriNumber)893 public void setConverted(String oriNumber) { 894 mNumberConverted = true; 895 mConvertedNumber = mAddress; 896 mAddress = oriNumber; 897 mDialString = oriNumber; 898 } 899 900 /** 901 * Notifies listeners of a change to conference participant(s). 902 * 903 * @param conferenceParticipants The participant(s). 904 */ updateConferenceParticipants(List<ConferenceParticipant> conferenceParticipants)905 public void updateConferenceParticipants(List<ConferenceParticipant> conferenceParticipants) { 906 for (Listener l : mListeners) { 907 l.onConferenceParticipantsChanged(conferenceParticipants); 908 } 909 } 910 911 /** 912 * Notifies listeners of a change to the multiparty state of the connection. 913 * 914 * @param isMultiparty The participant(s). 915 */ updateMultipartyState(boolean isMultiparty)916 public void updateMultipartyState(boolean isMultiparty) { 917 for (Listener l : mListeners) { 918 l.onMultipartyStateChanged(isMultiparty); 919 } 920 } 921 922 /** 923 * Notifies listeners of a failure in merging this connection with the background connection. 924 */ onConferenceMergeFailed()925 public void onConferenceMergeFailed() { 926 for (Listener l : mListeners) { 927 l.onConferenceMergedFailed(); 928 } 929 } 930 931 /** 932 * Notifies that the underlying phone has exited ECM mode. 933 */ onExitedEcmMode()934 public void onExitedEcmMode() { 935 for (Listener l : mListeners) { 936 l.onExitedEcmMode(); 937 } 938 } 939 940 /** 941 * Notifies the connection that a call to {@link #pullExternalCall()} has failed to pull the 942 * call to the local device. 943 * 944 * @param externalConnection The original 945 * {@link com.android.internal.telephony.imsphone.ImsExternalConnection} from which the 946 * pull was initiated. 947 */ onCallPullFailed(Connection externalConnection)948 public void onCallPullFailed(Connection externalConnection) { 949 for (Listener l : mListeners) { 950 l.onCallPullFailed(externalConnection); 951 } 952 } 953 954 /** 955 * Notifies the connection that there was a failure while handing over to WIFI. 956 */ onHandoverToWifiFailed()957 public void onHandoverToWifiFailed() { 958 for (Listener l : mListeners) { 959 l.onHandoverToWifiFailed(); 960 } 961 } 962 963 /** 964 * Notifies the connection of a connection event. 965 */ onConnectionEvent(String event, Bundle extras)966 public void onConnectionEvent(String event, Bundle extras) { 967 for (Listener l : mListeners) { 968 l.onConnectionEvent(event, extras); 969 } 970 } 971 972 /** 973 * Notifies this Connection of a request to disconnect a participant of the conference managed 974 * by the connection. 975 * 976 * @param endpoint the {@link Uri} of the participant to disconnect. 977 */ onDisconnectConferenceParticipant(Uri endpoint)978 public void onDisconnectConferenceParticipant(Uri endpoint) { 979 } 980 981 /** 982 * Called by a {@link android.telecom.Connection} to indicate that this call should be pulled 983 * to the local device. 984 */ pullExternalCall()985 public void pullExternalCall() { 986 } 987 988 /** 989 * 990 */ getPhoneType()991 public int getPhoneType() { 992 return mPhoneType; 993 } 994 995 /** 996 * Build a human representation of a connection instance, suitable for debugging. 997 * Don't log personal stuff unless in debug mode. 998 * @return a string representing the internal state of this connection. 999 */ toString()1000 public String toString() { 1001 StringBuilder str = new StringBuilder(128); 1002 1003 str.append(" callId: " + getTelecomCallId()); 1004 str.append(" isExternal: " + (((mConnectionCapabilities & Capability.IS_EXTERNAL_CONNECTION) 1005 == Capability.IS_EXTERNAL_CONNECTION) ? "Y" : "N")); 1006 if (Rlog.isLoggable(LOG_TAG, Log.DEBUG)) { 1007 str.append("addr: " + getAddress()) 1008 .append(" pres.: " + getNumberPresentation()) 1009 .append(" dial: " + getOrigDialString()) 1010 .append(" postdial: " + getRemainingPostDialString()) 1011 .append(" cnap name: " + getCnapName()) 1012 .append("(" + getCnapNamePresentation() + ")"); 1013 } 1014 str.append(" incoming: " + isIncoming()) 1015 .append(" state: " + getState()) 1016 .append(" post dial state: " + getPostDialState()); 1017 return str.toString(); 1018 } 1019 } 1020