1fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn/* 2fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn * Copyright (C) 2016 The Android Open Source Project 3fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn * 4fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn * Licensed under the Apache License, Version 2.0 (the "License"); 5fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn * you may not use this file except in compliance with the License. 6fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn * You may obtain a copy of the License at 7fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn * 8fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn * http://www.apache.org/licenses/LICENSE-2.0 9fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn * 10fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn * Unless required by applicable law or agreed to in writing, software 11fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn * distributed under the License is distributed on an "AS IS" BASIS, 12fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn * See the License for the specific language governing permissions and 14fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn * limitations under the License 15fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn */ 16fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn 17fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunnpackage com.android.internal.telephony.imsphone; 18fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn 19fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunnimport com.android.internal.telephony.Call; 20fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunnimport com.android.internal.telephony.CallStateException; 21fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunnimport com.android.internal.telephony.Connection; 22fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunnimport com.android.internal.telephony.Phone; 23fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunnimport com.android.internal.telephony.PhoneConstants; 24fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunnimport com.android.internal.telephony.UUSInfo; 25fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn 26fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunnimport android.telephony.Rlog; 27fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunnimport android.util.Log; 28fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn 2993da8529345711fd1a5617f3c8b15c0921eececbTyler Gunnimport java.util.Collections; 3093da8529345711fd1a5617f3c8b15c0921eececbTyler Gunnimport java.util.List; 3193da8529345711fd1a5617f3c8b15c0921eececbTyler Gunnimport java.util.Set; 3293da8529345711fd1a5617f3c8b15c0921eececbTyler Gunnimport java.util.concurrent.ConcurrentHashMap; 3393da8529345711fd1a5617f3c8b15c0921eececbTyler Gunn 34fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn/** 35fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn * Represents an IMS call external to the device. This class is used to represent a call which 36fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn * takes places on a secondary device associated with this one. Originates from a Dialog Event 37fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn * Package. 38fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn * 39fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn * Dialog event package information is received from the IMS framework via 40fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn * {@link com.android.ims.ImsExternalCallState} instances. 4193da8529345711fd1a5617f3c8b15c0921eececbTyler Gunn * 4293da8529345711fd1a5617f3c8b15c0921eececbTyler Gunn * @hide 43fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn */ 44fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunnpublic class ImsExternalConnection extends Connection { 45fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn 4693da8529345711fd1a5617f3c8b15c0921eececbTyler Gunn public interface Listener { 4793da8529345711fd1a5617f3c8b15c0921eececbTyler Gunn void onPullExternalCall(ImsExternalConnection connection); 4893da8529345711fd1a5617f3c8b15c0921eececbTyler Gunn } 4993da8529345711fd1a5617f3c8b15c0921eececbTyler Gunn 5093da8529345711fd1a5617f3c8b15c0921eececbTyler Gunn /** 5193da8529345711fd1a5617f3c8b15c0921eececbTyler Gunn * ConcurrentHashMap constructor params: 8 is initial table size, 0.9f is 5293da8529345711fd1a5617f3c8b15c0921eececbTyler Gunn * load factor before resizing, 1 means we only expect a single thread to 5393da8529345711fd1a5617f3c8b15c0921eececbTyler Gunn * access the map so make only a single shard 5493da8529345711fd1a5617f3c8b15c0921eececbTyler Gunn */ 5593da8529345711fd1a5617f3c8b15c0921eececbTyler Gunn private final Set<Listener> mListeners = Collections.newSetFromMap( 5693da8529345711fd1a5617f3c8b15c0921eececbTyler Gunn new ConcurrentHashMap<Listener, Boolean>(8, 0.9f, 1)); 5793da8529345711fd1a5617f3c8b15c0921eececbTyler Gunn 58fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn /** 59fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn * The unqiue dialog event package specified ID associated with this external connection. 60fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn */ 61fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn private int mCallId; 62fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn 63fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn /** 64fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn * A backing call associated with this external connection. 65fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn */ 66fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn private ImsExternalCall mCall; 67fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn 68fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn /** 69fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn * Determines if the call is pullable. 70fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn */ 71fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn private boolean mIsPullable; 72fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn 73fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn protected ImsExternalConnection(Phone phone, int callId, String address, boolean isPullable) { 74fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn super(phone.getPhoneType()); 75fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn mCall = new ImsExternalCall(phone, this); 76fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn mCallId = callId; 77fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn mAddress = address; 78fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn mNumberPresentation = PhoneConstants.PRESENTATION_ALLOWED; 79fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn mIsPullable = isPullable; 80fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn 81fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn rebuildCapabilities(); 82fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn setActive(); 83fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn } 84fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn 85fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn /** 86fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn * @return the unique ID of this connection from the dialog event package data. 87fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn */ 88fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn public int getCallId() { 89fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn return mCallId; 90fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn } 91fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn 92fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn @Override 93fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn public Call getCall() { 94fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn return mCall; 95fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn } 96fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn 97fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn @Override 98fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn public long getDisconnectTime() { 99fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn return 0; 100fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn } 101fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn 102fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn @Override 103fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn public long getHoldDurationMillis() { 104fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn return 0; 105fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn } 106fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn 107fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn @Override 108fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn public String getVendorDisconnectCause() { 109fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn return null; 110fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn } 111fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn 112fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn @Override 113fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn public void hangup() throws CallStateException { 114fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn // No-op - Hangup is not supported for external calls. 115fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn } 116fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn 117fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn @Override 118fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn public void separate() throws CallStateException { 119fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn // No-op - Separate is not supported for external calls. 120fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn } 121fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn 122fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn @Override 123fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn public void proceedAfterWaitChar() { 124fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn // No-op - not supported for external calls. 125fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn } 126fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn 127fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn @Override 128fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn public void proceedAfterWildChar(String str) { 129fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn // No-op - not supported for external calls. 130fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn } 131fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn 132fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn @Override 133fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn public void cancelPostDial() { 134fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn // No-op - not supported for external calls. 135fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn } 136fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn 137fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn @Override 138fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn public int getNumberPresentation() { 139fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn return mNumberPresentation; 140fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn } 141fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn 142fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn @Override 143fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn public UUSInfo getUUSInfo() { 144fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn return null; 145fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn } 146fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn 147fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn @Override 148fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn public int getPreciseDisconnectCause() { 149fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn return 0; 150fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn } 151fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn 152fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn @Override 153fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn public boolean isMultiparty() { 154fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn return false; 155fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn } 156fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn 157fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn /** 15893da8529345711fd1a5617f3c8b15c0921eececbTyler Gunn * Called by a {@link android.telecom.Connection} to indicate that this call should be pulled 15993da8529345711fd1a5617f3c8b15c0921eececbTyler Gunn * to the local device. 16093da8529345711fd1a5617f3c8b15c0921eececbTyler Gunn * 16193da8529345711fd1a5617f3c8b15c0921eececbTyler Gunn * Informs all listeners, in this case {@link ImsExternalCallTracker}, of the request to pull 16293da8529345711fd1a5617f3c8b15c0921eececbTyler Gunn * the call. 16393da8529345711fd1a5617f3c8b15c0921eececbTyler Gunn */ 16493da8529345711fd1a5617f3c8b15c0921eececbTyler Gunn @Override 16593da8529345711fd1a5617f3c8b15c0921eececbTyler Gunn public void pullExternalCall() { 16693da8529345711fd1a5617f3c8b15c0921eececbTyler Gunn for (Listener listener : mListeners) { 16793da8529345711fd1a5617f3c8b15c0921eececbTyler Gunn listener.onPullExternalCall(this); 16893da8529345711fd1a5617f3c8b15c0921eececbTyler Gunn } 16993da8529345711fd1a5617f3c8b15c0921eececbTyler Gunn } 17093da8529345711fd1a5617f3c8b15c0921eececbTyler Gunn 17193da8529345711fd1a5617f3c8b15c0921eececbTyler Gunn /** 172fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn * Sets this external call as active. 173fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn */ 174fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn public void setActive() { 175fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn if (mCall == null) { 176fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn return; 177fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn } 178fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn mCall.setActive(); 179fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn } 180fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn 181fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn /** 182fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn * Sets this external call as terminated. 183fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn */ 184fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn public void setTerminated() { 185fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn if (mCall == null) { 186fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn return; 187fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn } 188fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn 189fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn mCall.setTerminated(); 190fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn } 191fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn 192fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn /** 193fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn * Changes whether the call can be pulled or not. 194fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn * 195fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn * @param isPullable {@code true} if the call can be pulled, {@code false} otherwise. 196fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn */ 197fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn public void setIsPullable(boolean isPullable) { 198fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn mIsPullable = isPullable; 199fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn rebuildCapabilities(); 200fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn } 201fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn 20293da8529345711fd1a5617f3c8b15c0921eececbTyler Gunn public void addListener(Listener listener) { 20393da8529345711fd1a5617f3c8b15c0921eececbTyler Gunn mListeners.add(listener); 20493da8529345711fd1a5617f3c8b15c0921eececbTyler Gunn } 20593da8529345711fd1a5617f3c8b15c0921eececbTyler Gunn 20693da8529345711fd1a5617f3c8b15c0921eececbTyler Gunn public void removeListener(Listener listener) { 20793da8529345711fd1a5617f3c8b15c0921eececbTyler Gunn mListeners.remove(listener); 20893da8529345711fd1a5617f3c8b15c0921eececbTyler Gunn } 20993da8529345711fd1a5617f3c8b15c0921eececbTyler Gunn 210fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn /** 211fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn * Build a human representation of a connection instance, suitable for debugging. 212fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn * Don't log personal stuff unless in debug mode. 213fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn * @return a string representing the internal state of this connection. 214fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn */ 215fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn public String toString() { 216fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn StringBuilder str = new StringBuilder(128); 217fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn str.append("[ImsExternalConnection dialogCallId:"); 218fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn str.append(mCallId); 219fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn str.append(" state:"); 220fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn if (mCall.getState() == Call.State.ACTIVE) { 221fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn str.append("Active"); 222fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn } else if (mCall.getState() == Call.State.DISCONNECTED) { 223fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn str.append("Disconnected"); 224fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn } 225fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn str.append("]"); 226fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn return str.toString(); 227fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn } 228fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn 229fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn /** 230fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn * Rebuilds the connection capabilities. 231fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn */ 232fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn private void rebuildCapabilities() { 233fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn int capabilities = Capability.IS_EXTERNAL_CONNECTION; 234fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn if (mIsPullable) { 235fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn capabilities |= Capability.IS_PULLABLE; 236fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn } 237fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn 238fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn setConnectionCapabilities(capabilities); 239fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn } 240fec523bdc5d2b6dd90212c8076bf34bcc2ab08b2Tyler Gunn} 241