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