10825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville/*
20825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Copyright (C) 2006 The Android Open Source Project
30825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville *
40825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Licensed under the Apache License, Version 2.0 (the "License");
50825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * you may not use this file except in compliance with the License.
60825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * You may obtain a copy of the License at
70825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville *
80825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville *      http://www.apache.org/licenses/LICENSE-2.0
90825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville *
100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Unless required by applicable law or agreed to in writing, software
110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * distributed under the License is distributed on an "AS IS" BASIS,
120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * See the License for the specific language governing permissions and
140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * limitations under the License.
150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */
160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
170825495a331bb44df395a0cdb79fab85e68db5d5Wink Savillepackage com.android.internal.telephony;
180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
19d7f4ed8ac190763dce7e57b737caa44654b4592aTyler Gunnimport android.net.Uri;
20e64a413b850aae224e2f56e7dfc6e0bcd667643eUma Maheswari Ramalingamimport android.os.SystemClock;
21fdca22cc56b0e1ef1504e36a5aacb2ebbc4d146cTyler Gunnimport android.telecom.ConferenceParticipant;
2299c2e1d6749cfad2a8ca94a47857d8c3bfc09454Wink Savilleimport android.telephony.Rlog;
230825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.util.Log;
240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
257fa8ac39602ee9841dfcb0fb5c5f4d401925f8b5Tyler Gunnimport java.lang.Override;
260b9246d6254bed6f625fa9c551f7f9dcc33d4e38Evan Charltonimport java.util.ArrayList;
270b9246d6254bed6f625fa9c551f7f9dcc33d4e38Evan Charltonimport java.util.List;
2864e62340aae85179a6468ccac4a401900eb4dc2fTyler Gunnimport java.util.Set;
2964e62340aae85179a6468ccac4a401900eb4dc2fTyler Gunnimport java.util.concurrent.CopyOnWriteArraySet;
300b9246d6254bed6f625fa9c551f7f9dcc33d4e38Evan Charlton
310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville/**
320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * {@hide}
330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */
340825495a331bb44df395a0cdb79fab85e68db5d5Wink Savillepublic abstract class Connection {
350b9246d6254bed6f625fa9c551f7f9dcc33d4e38Evan Charlton    public interface PostDialListener {
360b9246d6254bed6f625fa9c551f7f9dcc33d4e38Evan Charlton        void onPostDialWait();
374567a0789e9966929c71af9a2c3866582c85c9e0Nancy Chen        void onPostDialChar(char c);
380b9246d6254bed6f625fa9c551f7f9dcc33d4e38Evan Charlton    }
390b9246d6254bed6f625fa9c551f7f9dcc33d4e38Evan Charlton
4064e62340aae85179a6468ccac4a401900eb4dc2fTyler Gunn    /**
4164e62340aae85179a6468ccac4a401900eb4dc2fTyler Gunn     * Listener interface for events related to the connection which should be reported to the
42dc2b5d1c32cad5269106d00fd106bd64097238f4Tyler Gunn     * {@link android.telecom.Connection}.
4364e62340aae85179a6468ccac4a401900eb4dc2fTyler Gunn     */
4464e62340aae85179a6468ccac4a401900eb4dc2fTyler Gunn    public interface Listener {
4564e62340aae85179a6468ccac4a401900eb4dc2fTyler Gunn        public void onVideoStateChanged(int videoState);
4664e62340aae85179a6468ccac4a401900eb4dc2fTyler Gunn        public void onLocalVideoCapabilityChanged(boolean capable);
4764e62340aae85179a6468ccac4a401900eb4dc2fTyler Gunn        public void onRemoteVideoCapabilityChanged(boolean capable);
48d5c5a168b4f5806701a4d146309c996acca7183dIhab Awad        public void onVideoProviderChanged(
49dc2b5d1c32cad5269106d00fd106bd64097238f4Tyler Gunn                android.telecom.Connection.VideoProvider videoProvider);
507fa8ac39602ee9841dfcb0fb5c5f4d401925f8b5Tyler Gunn        public void onAudioQualityChanged(int audioQuality);
51f53559f13dc272115f27f3b23955933da45ce127Tyler Gunn        public void onConferenceParticipantsChanged(List<ConferenceParticipant> participants);
5264e62340aae85179a6468ccac4a401900eb4dc2fTyler Gunn    }
5364e62340aae85179a6468ccac4a401900eb4dc2fTyler Gunn
5464e62340aae85179a6468ccac4a401900eb4dc2fTyler Gunn    /**
5564e62340aae85179a6468ccac4a401900eb4dc2fTyler Gunn     * Base listener implementation.
5664e62340aae85179a6468ccac4a401900eb4dc2fTyler Gunn     */
5764e62340aae85179a6468ccac4a401900eb4dc2fTyler Gunn    public abstract static class ListenerBase implements Listener {
5864e62340aae85179a6468ccac4a401900eb4dc2fTyler Gunn        @Override
5964e62340aae85179a6468ccac4a401900eb4dc2fTyler Gunn        public void onVideoStateChanged(int videoState) {}
6064e62340aae85179a6468ccac4a401900eb4dc2fTyler Gunn        @Override
6164e62340aae85179a6468ccac4a401900eb4dc2fTyler Gunn        public void onLocalVideoCapabilityChanged(boolean capable) {}
6264e62340aae85179a6468ccac4a401900eb4dc2fTyler Gunn        @Override
6364e62340aae85179a6468ccac4a401900eb4dc2fTyler Gunn        public void onRemoteVideoCapabilityChanged(boolean capable) {}
642999afbcfeab69bf7473e1b9bcabb1c9c6935b19Tyler Gunn        @Override
65d5c5a168b4f5806701a4d146309c996acca7183dIhab Awad        public void onVideoProviderChanged(
66dc2b5d1c32cad5269106d00fd106bd64097238f4Tyler Gunn                android.telecom.Connection.VideoProvider videoProvider) {}
677fa8ac39602ee9841dfcb0fb5c5f4d401925f8b5Tyler Gunn        @Override
687fa8ac39602ee9841dfcb0fb5c5f4d401925f8b5Tyler Gunn        public void onAudioQualityChanged(int audioQuality) {}
69fdca22cc56b0e1ef1504e36a5aacb2ebbc4d146cTyler Gunn        @Override
70f53559f13dc272115f27f3b23955933da45ce127Tyler Gunn        public void onConferenceParticipantsChanged(List<ConferenceParticipant> participants) {}
7164e62340aae85179a6468ccac4a401900eb4dc2fTyler Gunn    }
7264e62340aae85179a6468ccac4a401900eb4dc2fTyler Gunn
737fa8ac39602ee9841dfcb0fb5c5f4d401925f8b5Tyler Gunn    public static final int AUDIO_QUALITY_STANDARD = 1;
747fa8ac39602ee9841dfcb0fb5c5f4d401925f8b5Tyler Gunn    public static final int AUDIO_QUALITY_HIGH_DEFINITION = 2;
757fa8ac39602ee9841dfcb0fb5c5f4d401925f8b5Tyler Gunn
760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    //Caller Name Display
7722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville    protected String mCnapName;
7822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville    protected int mCnapNamePresentation  = PhoneConstants.PRESENTATION_ALLOWED;
79e64a413b850aae224e2f56e7dfc6e0bcd667643eUma Maheswari Ramalingam    protected String mAddress;     // MAY BE NULL!!!
80e64a413b850aae224e2f56e7dfc6e0bcd667643eUma Maheswari Ramalingam    protected String mDialString;          // outgoing calls only
81e64a413b850aae224e2f56e7dfc6e0bcd667643eUma Maheswari Ramalingam    protected int mNumberPresentation = PhoneConstants.PRESENTATION_ALLOWED;
82e64a413b850aae224e2f56e7dfc6e0bcd667643eUma Maheswari Ramalingam    protected boolean mIsIncoming;
83e64a413b850aae224e2f56e7dfc6e0bcd667643eUma Maheswari Ramalingam    /*
84e64a413b850aae224e2f56e7dfc6e0bcd667643eUma Maheswari Ramalingam     * These time/timespan values are based on System.currentTimeMillis(),
85e64a413b850aae224e2f56e7dfc6e0bcd667643eUma Maheswari Ramalingam     * i.e., "wall clock" time.
86e64a413b850aae224e2f56e7dfc6e0bcd667643eUma Maheswari Ramalingam     */
87e64a413b850aae224e2f56e7dfc6e0bcd667643eUma Maheswari Ramalingam    protected long mCreateTime;
88e64a413b850aae224e2f56e7dfc6e0bcd667643eUma Maheswari Ramalingam    protected long mConnectTime;
89e64a413b850aae224e2f56e7dfc6e0bcd667643eUma Maheswari Ramalingam    /*
90e64a413b850aae224e2f56e7dfc6e0bcd667643eUma Maheswari Ramalingam     * These time/timespan values are based on SystemClock.elapsedRealTime(),
91e64a413b850aae224e2f56e7dfc6e0bcd667643eUma Maheswari Ramalingam     * i.e., time since boot.  They are appropriate for comparison and
92e64a413b850aae224e2f56e7dfc6e0bcd667643eUma Maheswari Ramalingam     * calculating deltas.
93e64a413b850aae224e2f56e7dfc6e0bcd667643eUma Maheswari Ramalingam     */
94e64a413b850aae224e2f56e7dfc6e0bcd667643eUma Maheswari Ramalingam    protected long mConnectTimeReal;
95e64a413b850aae224e2f56e7dfc6e0bcd667643eUma Maheswari Ramalingam    protected long mDuration;
96e64a413b850aae224e2f56e7dfc6e0bcd667643eUma Maheswari Ramalingam    protected long mHoldingStartTime;  // The time when the Connection last transitioned
97e64a413b850aae224e2f56e7dfc6e0bcd667643eUma Maheswari Ramalingam                            // into HOLDING
98e64a413b850aae224e2f56e7dfc6e0bcd667643eUma Maheswari Ramalingam    protected Connection mOrigConnection;
990b9246d6254bed6f625fa9c551f7f9dcc33d4e38Evan Charlton    private List<PostDialListener> mPostDialListeners = new ArrayList<>();
100e64a413b850aae224e2f56e7dfc6e0bcd667643eUma Maheswari Ramalingam    public Set<Listener> mListeners = new CopyOnWriteArraySet<>();
1010b9246d6254bed6f625fa9c551f7f9dcc33d4e38Evan Charlton
1022d265969ca301ba3720458ea9da2ec8d6a18bb8dXia Ying    protected boolean mNumberConverted = false;
1032d265969ca301ba3720458ea9da2ec8d6a18bb8dXia Ying    protected String mConvertedNumber;
1042d265969ca301ba3720458ea9da2ec8d6a18bb8dXia Ying
105cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    private static String LOG_TAG = "Connection";
1060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
10722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville    Object mUserData;
10864e62340aae85179a6468ccac4a401900eb4dc2fTyler Gunn    private int mVideoState;
10964e62340aae85179a6468ccac4a401900eb4dc2fTyler Gunn    private boolean mLocalVideoCapable;
11064e62340aae85179a6468ccac4a401900eb4dc2fTyler Gunn    private boolean mRemoteVideoCapable;
1117fa8ac39602ee9841dfcb0fb5c5f4d401925f8b5Tyler Gunn    private int mAudioQuality;
112dc2b5d1c32cad5269106d00fd106bd64097238f4Tyler Gunn    private android.telecom.Connection.VideoProvider mVideoProvider;
1134be56374921b52d54b80889540d982f39d26e3abUma Maheswari Ramalingam    public Call.State mPreHandoverState = Call.State.IDLE;
1140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /* Instance Methods */
1160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
1180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Gets address (e.g. phone number) associated with connection.
1190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * TODO: distinguish reasons for unavailability
1200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *
1210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @return address or null if unavailable
1220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
1230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
124e64a413b850aae224e2f56e7dfc6e0bcd667643eUma Maheswari Ramalingam    public String getAddress() {
125e64a413b850aae224e2f56e7dfc6e0bcd667643eUma Maheswari Ramalingam        return mAddress;
126e64a413b850aae224e2f56e7dfc6e0bcd667643eUma Maheswari Ramalingam    }
1270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
1290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Gets CNAP name associated with connection.
1300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @return cnap name or null if unavailable
1310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
1320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public String getCnapName() {
13322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        return mCnapName;
1340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
1370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Get original dial string.
1380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @return original dial string or null if unavailable
1390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
1400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public String getOrigDialString(){
1410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return null;
1420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
1450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Gets CNAP presentation associated with connection.
1460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @return cnap name or null if unavailable
1470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
1480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public int getCnapNamePresentation() {
15022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville       return mCnapNamePresentation;
151cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    }
1520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
1540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @return Call that owns this Connection, or null if none
1550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
1560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public abstract Call getCall();
1570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
1590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Connection create time in currentTimeMillis() format
1600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Basically, set when object is created.
1610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Effectively, when an incoming call starts ringing or an
1620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * outgoing call starts dialing
1630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
164e64a413b850aae224e2f56e7dfc6e0bcd667643eUma Maheswari Ramalingam    public long getCreateTime() {
165e64a413b850aae224e2f56e7dfc6e0bcd667643eUma Maheswari Ramalingam        return mCreateTime;
166e64a413b850aae224e2f56e7dfc6e0bcd667643eUma Maheswari Ramalingam    }
1670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
1690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Connection connect time in currentTimeMillis() format.
1700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * For outgoing calls: Begins at (DIALING|ALERTING) -> ACTIVE transition.
1710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * For incoming calls: Begins at (INCOMING|WAITING) -> ACTIVE transition.
1720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Returns 0 before then.
1730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
174e64a413b850aae224e2f56e7dfc6e0bcd667643eUma Maheswari Ramalingam    public long getConnectTime() {
175e64a413b850aae224e2f56e7dfc6e0bcd667643eUma Maheswari Ramalingam        return mConnectTime;
176e64a413b850aae224e2f56e7dfc6e0bcd667643eUma Maheswari Ramalingam    }
1770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
17931b502cb274be3c20b993d51192b56f0e7a9ae09Tyler Gunn     * Sets the Connection connect time in currentTimeMillis() format.
18031b502cb274be3c20b993d51192b56f0e7a9ae09Tyler Gunn     *
18131b502cb274be3c20b993d51192b56f0e7a9ae09Tyler Gunn     * @param connectTime the new connect time.
18231b502cb274be3c20b993d51192b56f0e7a9ae09Tyler Gunn     */
18331b502cb274be3c20b993d51192b56f0e7a9ae09Tyler Gunn    public void setConnectTime(long connectTime) {
18431b502cb274be3c20b993d51192b56f0e7a9ae09Tyler Gunn        mConnectTime = connectTime;
18531b502cb274be3c20b993d51192b56f0e7a9ae09Tyler Gunn    }
18631b502cb274be3c20b993d51192b56f0e7a9ae09Tyler Gunn
18731b502cb274be3c20b993d51192b56f0e7a9ae09Tyler Gunn    /**
188a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville     * Connection connect time in elapsedRealtime() format.
189a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville     * For outgoing calls: Begins at (DIALING|ALERTING) -> ACTIVE transition.
190a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville     * For incoming calls: Begins at (INCOMING|WAITING) -> ACTIVE transition.
191a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville     * Returns 0 before then.
192a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville     */
193e64a413b850aae224e2f56e7dfc6e0bcd667643eUma Maheswari Ramalingam    public long getConnectTimeReal() {
194e64a413b850aae224e2f56e7dfc6e0bcd667643eUma Maheswari Ramalingam        return mConnectTimeReal;
195e64a413b850aae224e2f56e7dfc6e0bcd667643eUma Maheswari Ramalingam    }
196a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
197a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    /**
1980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Disconnect time in currentTimeMillis() format.
1990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * The time when this Connection makes a transition into ENDED or FAIL.
2000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Returns 0 before then.
2010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
2020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public abstract long getDisconnectTime();
2030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
2050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Returns the number of milliseconds the call has been connected,
2060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * or 0 if the call has never connected.
2070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * If the call is still connected, then returns the elapsed
2080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * time since connect.
2090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
210e64a413b850aae224e2f56e7dfc6e0bcd667643eUma Maheswari Ramalingam    public long getDurationMillis() {
211e64a413b850aae224e2f56e7dfc6e0bcd667643eUma Maheswari Ramalingam        if (mConnectTimeReal == 0) {
212e64a413b850aae224e2f56e7dfc6e0bcd667643eUma Maheswari Ramalingam            return 0;
213e64a413b850aae224e2f56e7dfc6e0bcd667643eUma Maheswari Ramalingam        } else if (mDuration == 0) {
214e64a413b850aae224e2f56e7dfc6e0bcd667643eUma Maheswari Ramalingam            return SystemClock.elapsedRealtime() - mConnectTimeReal;
215e64a413b850aae224e2f56e7dfc6e0bcd667643eUma Maheswari Ramalingam        } else {
216e64a413b850aae224e2f56e7dfc6e0bcd667643eUma Maheswari Ramalingam            return mDuration;
217e64a413b850aae224e2f56e7dfc6e0bcd667643eUma Maheswari Ramalingam        }
218e64a413b850aae224e2f56e7dfc6e0bcd667643eUma Maheswari Ramalingam    }
2190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
221a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville     * The time when this Connection last transitioned into HOLDING
222a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville     * in elapsedRealtime() format.
223a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville     * Returns 0, if it has never made a transition into HOLDING.
224a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville     */
225e64a413b850aae224e2f56e7dfc6e0bcd667643eUma Maheswari Ramalingam    public long getHoldingStartTime() {
226e64a413b850aae224e2f56e7dfc6e0bcd667643eUma Maheswari Ramalingam        return mHoldingStartTime;
227e64a413b850aae224e2f56e7dfc6e0bcd667643eUma Maheswari Ramalingam    }
228a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
229a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    /**
2300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * If this connection is HOLDING, return the number of milliseconds
2310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * that it has been on hold for (approximately).
2320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * If this connection is in any other state, return 0.
2330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
2340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public abstract long getHoldDurationMillis();
2360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
238b7b7a62112b79571adf74372c5f5366fd62d0031Anders Kristensen     * Returns call disconnect cause. Values are defined in
239b7b7a62112b79571adf74372c5f5366fd62d0031Anders Kristensen     * {@link android.telephony.DisconnectCause}. If the call is not yet
240b7b7a62112b79571adf74372c5f5366fd62d0031Anders Kristensen     * disconnected, NOT_DISCONNECTED is returned.
2410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
242b7b7a62112b79571adf74372c5f5366fd62d0031Anders Kristensen    public abstract int getDisconnectCause();
2430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
2450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Returns true of this connection originated elsewhere
2460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * ("MT" or mobile terminated; another party called this terminal)
2470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * or false if this call originated here (MO or mobile originated).
2480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
249e64a413b850aae224e2f56e7dfc6e0bcd667643eUma Maheswari Ramalingam    public boolean isIncoming() {
250e64a413b850aae224e2f56e7dfc6e0bcd667643eUma Maheswari Ramalingam        return mIsIncoming;
251e64a413b850aae224e2f56e7dfc6e0bcd667643eUma Maheswari Ramalingam    }
2520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
2540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * If this Connection is connected, then it is associated with
2550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * a Call.
2560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *
2570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Returns getCall().getState() or Call.State.IDLE if not
2580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * connected
2590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
2600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public Call.State getState() {
2610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        Call c;
2620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        c = getCall();
2640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (c == null) {
2660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            return Call.State.IDLE;
2670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        } else {
2680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            return c.getState();
2690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
2700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
2710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
2734be56374921b52d54b80889540d982f39d26e3abUma Maheswari Ramalingam     * If this connection went through handover return the state of the
2744be56374921b52d54b80889540d982f39d26e3abUma Maheswari Ramalingam     * call that contained this connection before handover.
2754be56374921b52d54b80889540d982f39d26e3abUma Maheswari Ramalingam     */
2764be56374921b52d54b80889540d982f39d26e3abUma Maheswari Ramalingam    public Call.State getStateBeforeHandover() {
2774be56374921b52d54b80889540d982f39d26e3abUma Maheswari Ramalingam        return mPreHandoverState;
2784be56374921b52d54b80889540d982f39d26e3abUma Maheswari Ramalingam    }
2794be56374921b52d54b80889540d982f39d26e3abUma Maheswari Ramalingam
2804be56374921b52d54b80889540d982f39d26e3abUma Maheswari Ramalingam    /**
2810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * isAlive()
2820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *
2830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @return true if the connection isn't disconnected
2840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * (could be active, holding, ringing, dialing, etc)
2850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
2860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public boolean
2870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    isAlive() {
2880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return getState().isAlive();
2890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
2900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
2920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Returns true if Connection is connected and is INCOMING or WAITING
2930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
2940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public boolean
2950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    isRinging() {
2960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return getState().isRinging();
2970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
2980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
3000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *
3010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @return the userdata set in setUserData()
3020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
3030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public Object getUserData() {
30422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        return mUserData;
3050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
3060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
3080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *
3090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @param userdata user can store an any userdata in the Connection object.
3100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
3110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void setUserData(Object userdata) {
31222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mUserData = userdata;
3130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
3140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
3160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Hangup individual Connection
3170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
3180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public abstract void hangup() throws CallStateException;
3190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
3210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Separate this call from its owner Call and assigns it to a new Call
3220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * (eg if it is currently part of a Conference call
3230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * TODO: Throw exception? Does GSM require error display on failure here?
3240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
3250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public abstract void separate() throws CallStateException;
3260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public enum PostDialState {
3280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        NOT_STARTED,    /* The post dial string playback hasn't
3290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                           been started, or this call is not yet
3300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                           connected, or this is an incoming call */
3310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        STARTED,        /* The post dial string playback has begun */
3320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        WAIT,           /* The post dial string playback is waiting for a
3330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                           call to proceedAfterWaitChar() */
3340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        WILD,           /* The post dial string playback is waiting for a
3350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                           call to proceedAfterWildChar() */
3360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        COMPLETE,       /* The post dial string playback is complete */
3370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        CANCELLED,       /* The post dial string playback was cancelled
3380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                           with cancelPostDial() */
3390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        PAUSE           /* The post dial string playback is pausing for a
3400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                           call to processNextPostDialChar*/
3410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
3420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void clearUserData(){
34422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mUserData = null;
3450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
3460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3470b9246d6254bed6f625fa9c551f7f9dcc33d4e38Evan Charlton    public final void addPostDialListener(PostDialListener listener) {
3480b9246d6254bed6f625fa9c551f7f9dcc33d4e38Evan Charlton        if (!mPostDialListeners.contains(listener)) {
3490b9246d6254bed6f625fa9c551f7f9dcc33d4e38Evan Charlton            mPostDialListeners.add(listener);
3500b9246d6254bed6f625fa9c551f7f9dcc33d4e38Evan Charlton        }
3510b9246d6254bed6f625fa9c551f7f9dcc33d4e38Evan Charlton    }
3520b9246d6254bed6f625fa9c551f7f9dcc33d4e38Evan Charlton
3530b9246d6254bed6f625fa9c551f7f9dcc33d4e38Evan Charlton    protected final void clearPostDialListeners() {
3540b9246d6254bed6f625fa9c551f7f9dcc33d4e38Evan Charlton        mPostDialListeners.clear();
3550b9246d6254bed6f625fa9c551f7f9dcc33d4e38Evan Charlton    }
3560b9246d6254bed6f625fa9c551f7f9dcc33d4e38Evan Charlton
3570b9246d6254bed6f625fa9c551f7f9dcc33d4e38Evan Charlton    protected final void notifyPostDialListeners() {
3580b9246d6254bed6f625fa9c551f7f9dcc33d4e38Evan Charlton        if (getPostDialState() == PostDialState.WAIT) {
3590b9246d6254bed6f625fa9c551f7f9dcc33d4e38Evan Charlton            for (PostDialListener listener : new ArrayList<>(mPostDialListeners)) {
3600b9246d6254bed6f625fa9c551f7f9dcc33d4e38Evan Charlton                listener.onPostDialWait();
3610b9246d6254bed6f625fa9c551f7f9dcc33d4e38Evan Charlton            }
3620b9246d6254bed6f625fa9c551f7f9dcc33d4e38Evan Charlton        }
3630b9246d6254bed6f625fa9c551f7f9dcc33d4e38Evan Charlton    }
3640b9246d6254bed6f625fa9c551f7f9dcc33d4e38Evan Charlton
3654567a0789e9966929c71af9a2c3866582c85c9e0Nancy Chen    protected final void notifyPostDialListenersNextChar(char c) {
3664567a0789e9966929c71af9a2c3866582c85c9e0Nancy Chen        for (PostDialListener listener : new ArrayList<>(mPostDialListeners)) {
3674567a0789e9966929c71af9a2c3866582c85c9e0Nancy Chen            listener.onPostDialChar(c);
3684567a0789e9966929c71af9a2c3866582c85c9e0Nancy Chen        }
3694567a0789e9966929c71af9a2c3866582c85c9e0Nancy Chen    }
3704567a0789e9966929c71af9a2c3866582c85c9e0Nancy Chen
3710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public abstract PostDialState getPostDialState();
3720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
3740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Returns the portion of the post dial string that has not
3750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * yet been dialed, or "" if none
3760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
3770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public abstract String getRemainingPostDialString();
3780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
3800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * See Phone.setOnPostDialWaitCharacter()
3810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
3820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public abstract void proceedAfterWaitChar();
3840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
3860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * See Phone.setOnPostDialWildCharacter()
3870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
3880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public abstract void proceedAfterWildChar(String str);
3890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
3900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Cancel any post
3910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
3920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public abstract void cancelPostDial();
3930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
3950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Returns the caller id presentation type for incoming and waiting calls
3960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @return one of PRESENTATION_*
3970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
3980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public abstract int getNumberPresentation();
3990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
4000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
4010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Returns the User to User Signaling (UUS) information associated with
4020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * incoming and waiting calls
4030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @return UUSInfo containing the UUS userdata.
4040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
4050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public abstract UUSInfo getUUSInfo();
4060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
4070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
4080742246233c3f03f864d23e52d89e1845d994701Antonio Marín Cerezuela     * Returns the CallFail reason provided by the RIL with the result of
4090742246233c3f03f864d23e52d89e1845d994701Antonio Marín Cerezuela     * RIL_REQUEST_LAST_CALL_FAIL_CAUSE
4100742246233c3f03f864d23e52d89e1845d994701Antonio Marín Cerezuela     */
4110742246233c3f03f864d23e52d89e1845d994701Antonio Marín Cerezuela    public abstract int getPreciseDisconnectCause();
4120742246233c3f03f864d23e52d89e1845d994701Antonio Marín Cerezuela
4130742246233c3f03f864d23e52d89e1845d994701Antonio Marín Cerezuela    /**
414a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville     * Returns the original Connection instance associated with
415a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville     * this Connection
416a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville     */
417e64a413b850aae224e2f56e7dfc6e0bcd667643eUma Maheswari Ramalingam    public Connection getOrigConnection() {
418e64a413b850aae224e2f56e7dfc6e0bcd667643eUma Maheswari Ramalingam        return mOrigConnection;
419e64a413b850aae224e2f56e7dfc6e0bcd667643eUma Maheswari Ramalingam    }
420a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
421a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    /**
422a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville     * Returns whether the original ImsPhoneConnection was a member
423a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville     * of a conference call
424a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville     * @return valid only when getOrigConnection() is not null
425a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville     */
426a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    public abstract boolean isMultiparty();
427a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
428e64a413b850aae224e2f56e7dfc6e0bcd667643eUma Maheswari Ramalingam    public void migrateFrom(Connection c) {
429e64a413b850aae224e2f56e7dfc6e0bcd667643eUma Maheswari Ramalingam        if (c == null) return;
430e64a413b850aae224e2f56e7dfc6e0bcd667643eUma Maheswari Ramalingam        mListeners = c.mListeners;
431e64a413b850aae224e2f56e7dfc6e0bcd667643eUma Maheswari Ramalingam        mAddress = c.getAddress();
432e64a413b850aae224e2f56e7dfc6e0bcd667643eUma Maheswari Ramalingam        mNumberPresentation = c.getNumberPresentation();
433e64a413b850aae224e2f56e7dfc6e0bcd667643eUma Maheswari Ramalingam        mDialString = c.getOrigDialString();
434e64a413b850aae224e2f56e7dfc6e0bcd667643eUma Maheswari Ramalingam        mCnapName = c.getCnapName();
435e64a413b850aae224e2f56e7dfc6e0bcd667643eUma Maheswari Ramalingam        mCnapNamePresentation = c.getCnapNamePresentation();
436e64a413b850aae224e2f56e7dfc6e0bcd667643eUma Maheswari Ramalingam        mIsIncoming = c.isIncoming();
437e64a413b850aae224e2f56e7dfc6e0bcd667643eUma Maheswari Ramalingam        mCreateTime = c.getCreateTime();
438e64a413b850aae224e2f56e7dfc6e0bcd667643eUma Maheswari Ramalingam        mConnectTime = c.getConnectTime();
439e64a413b850aae224e2f56e7dfc6e0bcd667643eUma Maheswari Ramalingam        mConnectTimeReal = c.getConnectTimeReal();
440e64a413b850aae224e2f56e7dfc6e0bcd667643eUma Maheswari Ramalingam        mHoldingStartTime = c.getHoldingStartTime();
441e64a413b850aae224e2f56e7dfc6e0bcd667643eUma Maheswari Ramalingam        mOrigConnection = c.getOrigConnection();
442e64a413b850aae224e2f56e7dfc6e0bcd667643eUma Maheswari Ramalingam    }
443e64a413b850aae224e2f56e7dfc6e0bcd667643eUma Maheswari Ramalingam
444a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    /**
44564e62340aae85179a6468ccac4a401900eb4dc2fTyler Gunn     * Assign a listener to be notified of state changes.
44664e62340aae85179a6468ccac4a401900eb4dc2fTyler Gunn     *
44764e62340aae85179a6468ccac4a401900eb4dc2fTyler Gunn     * @param listener A listener.
44864e62340aae85179a6468ccac4a401900eb4dc2fTyler Gunn     */
44964e62340aae85179a6468ccac4a401900eb4dc2fTyler Gunn    public final void addListener(Listener listener) {
45064e62340aae85179a6468ccac4a401900eb4dc2fTyler Gunn        mListeners.add(listener);
45164e62340aae85179a6468ccac4a401900eb4dc2fTyler Gunn    }
45264e62340aae85179a6468ccac4a401900eb4dc2fTyler Gunn
45364e62340aae85179a6468ccac4a401900eb4dc2fTyler Gunn    /**
45464e62340aae85179a6468ccac4a401900eb4dc2fTyler Gunn     * Removes a listener.
45564e62340aae85179a6468ccac4a401900eb4dc2fTyler Gunn     *
45664e62340aae85179a6468ccac4a401900eb4dc2fTyler Gunn     * @param listener A listener.
45764e62340aae85179a6468ccac4a401900eb4dc2fTyler Gunn     */
45864e62340aae85179a6468ccac4a401900eb4dc2fTyler Gunn    public final void removeListener(Listener listener) {
45964e62340aae85179a6468ccac4a401900eb4dc2fTyler Gunn        mListeners.remove(listener);
46064e62340aae85179a6468ccac4a401900eb4dc2fTyler Gunn    }
46164e62340aae85179a6468ccac4a401900eb4dc2fTyler Gunn
46264e62340aae85179a6468ccac4a401900eb4dc2fTyler Gunn    /**
46364e62340aae85179a6468ccac4a401900eb4dc2fTyler Gunn     * Returns the current video state of the connection.
46464e62340aae85179a6468ccac4a401900eb4dc2fTyler Gunn     *
46564e62340aae85179a6468ccac4a401900eb4dc2fTyler Gunn     * @return The video state of the connection.
46664e62340aae85179a6468ccac4a401900eb4dc2fTyler Gunn     */
46764e62340aae85179a6468ccac4a401900eb4dc2fTyler Gunn    public int getVideoState() {
46864e62340aae85179a6468ccac4a401900eb4dc2fTyler Gunn        return mVideoState;
46964e62340aae85179a6468ccac4a401900eb4dc2fTyler Gunn    }
47064e62340aae85179a6468ccac4a401900eb4dc2fTyler Gunn
47164e62340aae85179a6468ccac4a401900eb4dc2fTyler Gunn    /**
47264e62340aae85179a6468ccac4a401900eb4dc2fTyler Gunn     * Returns the local video capability state for the connection.
47364e62340aae85179a6468ccac4a401900eb4dc2fTyler Gunn     *
47464e62340aae85179a6468ccac4a401900eb4dc2fTyler Gunn     * @return {@code True} if the connection has local video capabilities.
47564e62340aae85179a6468ccac4a401900eb4dc2fTyler Gunn     */
47664e62340aae85179a6468ccac4a401900eb4dc2fTyler Gunn    public boolean isLocalVideoCapable() {
47764e62340aae85179a6468ccac4a401900eb4dc2fTyler Gunn        return mLocalVideoCapable;
47864e62340aae85179a6468ccac4a401900eb4dc2fTyler Gunn    }
47964e62340aae85179a6468ccac4a401900eb4dc2fTyler Gunn
48064e62340aae85179a6468ccac4a401900eb4dc2fTyler Gunn    /**
48164e62340aae85179a6468ccac4a401900eb4dc2fTyler Gunn     * Returns the remote video capability state for the connection.
48264e62340aae85179a6468ccac4a401900eb4dc2fTyler Gunn     *
48364e62340aae85179a6468ccac4a401900eb4dc2fTyler Gunn     * @return {@code True} if the connection has remote video capabilities.
48464e62340aae85179a6468ccac4a401900eb4dc2fTyler Gunn     */
48564e62340aae85179a6468ccac4a401900eb4dc2fTyler Gunn    public boolean isRemoteVideoCapable() {
48664e62340aae85179a6468ccac4a401900eb4dc2fTyler Gunn        return mRemoteVideoCapable;
48764e62340aae85179a6468ccac4a401900eb4dc2fTyler Gunn    }
48864e62340aae85179a6468ccac4a401900eb4dc2fTyler Gunn
4892999afbcfeab69bf7473e1b9bcabb1c9c6935b19Tyler Gunn    /**
490dc2b5d1c32cad5269106d00fd106bd64097238f4Tyler Gunn     * Returns the {@link android.telecom.Connection.VideoProvider} for the connection.
4912999afbcfeab69bf7473e1b9bcabb1c9c6935b19Tyler Gunn     *
492dc2b5d1c32cad5269106d00fd106bd64097238f4Tyler Gunn     * @return The {@link android.telecom.Connection.VideoProvider}.
4932999afbcfeab69bf7473e1b9bcabb1c9c6935b19Tyler Gunn     */
494dc2b5d1c32cad5269106d00fd106bd64097238f4Tyler Gunn    public android.telecom.Connection.VideoProvider getVideoProvider() {
495d5c5a168b4f5806701a4d146309c996acca7183dIhab Awad        return mVideoProvider;
4962999afbcfeab69bf7473e1b9bcabb1c9c6935b19Tyler Gunn    }
49764e62340aae85179a6468ccac4a401900eb4dc2fTyler Gunn
49864e62340aae85179a6468ccac4a401900eb4dc2fTyler Gunn    /**
4997fa8ac39602ee9841dfcb0fb5c5f4d401925f8b5Tyler Gunn     * Returns the audio-quality for the connection.
5007fa8ac39602ee9841dfcb0fb5c5f4d401925f8b5Tyler Gunn     *
5017fa8ac39602ee9841dfcb0fb5c5f4d401925f8b5Tyler Gunn     * @return The audio quality for the connection.
5027fa8ac39602ee9841dfcb0fb5c5f4d401925f8b5Tyler Gunn     */
5037fa8ac39602ee9841dfcb0fb5c5f4d401925f8b5Tyler Gunn    public int getAudioQuality() {
5047fa8ac39602ee9841dfcb0fb5c5f4d401925f8b5Tyler Gunn        return mAudioQuality;
5057fa8ac39602ee9841dfcb0fb5c5f4d401925f8b5Tyler Gunn    }
5067fa8ac39602ee9841dfcb0fb5c5f4d401925f8b5Tyler Gunn
5077fa8ac39602ee9841dfcb0fb5c5f4d401925f8b5Tyler Gunn    /**
50864e62340aae85179a6468ccac4a401900eb4dc2fTyler Gunn     * Sets the videoState for the current connection and reports the changes to all listeners.
509dc2b5d1c32cad5269106d00fd106bd64097238f4Tyler Gunn     * Valid video states are defined in {@link android.telecom.VideoProfile}.
51064e62340aae85179a6468ccac4a401900eb4dc2fTyler Gunn     *
51164e62340aae85179a6468ccac4a401900eb4dc2fTyler Gunn     * @return The video state.
51264e62340aae85179a6468ccac4a401900eb4dc2fTyler Gunn     */
51364e62340aae85179a6468ccac4a401900eb4dc2fTyler Gunn    public void setVideoState(int videoState) {
51464e62340aae85179a6468ccac4a401900eb4dc2fTyler Gunn        mVideoState = videoState;
51564e62340aae85179a6468ccac4a401900eb4dc2fTyler Gunn        for (Listener l : mListeners) {
51664e62340aae85179a6468ccac4a401900eb4dc2fTyler Gunn            l.onVideoStateChanged(mVideoState);
51764e62340aae85179a6468ccac4a401900eb4dc2fTyler Gunn        }
51864e62340aae85179a6468ccac4a401900eb4dc2fTyler Gunn    }
51964e62340aae85179a6468ccac4a401900eb4dc2fTyler Gunn
52064e62340aae85179a6468ccac4a401900eb4dc2fTyler Gunn    /**
52164e62340aae85179a6468ccac4a401900eb4dc2fTyler Gunn     * Sets whether video capability is present locally.
52264e62340aae85179a6468ccac4a401900eb4dc2fTyler Gunn     *
52364e62340aae85179a6468ccac4a401900eb4dc2fTyler Gunn     * @param capable {@code True} if video capable.
52464e62340aae85179a6468ccac4a401900eb4dc2fTyler Gunn     */
52564e62340aae85179a6468ccac4a401900eb4dc2fTyler Gunn    public void setLocalVideoCapable(boolean capable) {
52664e62340aae85179a6468ccac4a401900eb4dc2fTyler Gunn        mLocalVideoCapable = capable;
52764e62340aae85179a6468ccac4a401900eb4dc2fTyler Gunn        for (Listener l : mListeners) {
52864e62340aae85179a6468ccac4a401900eb4dc2fTyler Gunn            l.onLocalVideoCapabilityChanged(mLocalVideoCapable);
52964e62340aae85179a6468ccac4a401900eb4dc2fTyler Gunn        }
53064e62340aae85179a6468ccac4a401900eb4dc2fTyler Gunn    }
53164e62340aae85179a6468ccac4a401900eb4dc2fTyler Gunn
53264e62340aae85179a6468ccac4a401900eb4dc2fTyler Gunn    /**
53364e62340aae85179a6468ccac4a401900eb4dc2fTyler Gunn     * Sets whether video capability is present remotely.
53464e62340aae85179a6468ccac4a401900eb4dc2fTyler Gunn     *
53564e62340aae85179a6468ccac4a401900eb4dc2fTyler Gunn     * @param capable {@code True} if video capable.
53664e62340aae85179a6468ccac4a401900eb4dc2fTyler Gunn     */
53764e62340aae85179a6468ccac4a401900eb4dc2fTyler Gunn    public void setRemoteVideoCapable(boolean capable) {
53864e62340aae85179a6468ccac4a401900eb4dc2fTyler Gunn        mRemoteVideoCapable = capable;
53964e62340aae85179a6468ccac4a401900eb4dc2fTyler Gunn        for (Listener l : mListeners) {
54064e62340aae85179a6468ccac4a401900eb4dc2fTyler Gunn            l.onRemoteVideoCapabilityChanged(mRemoteVideoCapable);
54164e62340aae85179a6468ccac4a401900eb4dc2fTyler Gunn        }
54264e62340aae85179a6468ccac4a401900eb4dc2fTyler Gunn    }
54364e62340aae85179a6468ccac4a401900eb4dc2fTyler Gunn
54464e62340aae85179a6468ccac4a401900eb4dc2fTyler Gunn    /**
5457fa8ac39602ee9841dfcb0fb5c5f4d401925f8b5Tyler Gunn     * Set the audio quality for the connection.
5467fa8ac39602ee9841dfcb0fb5c5f4d401925f8b5Tyler Gunn     *
5477fa8ac39602ee9841dfcb0fb5c5f4d401925f8b5Tyler Gunn     * @param audioQuality The audio quality.
5487fa8ac39602ee9841dfcb0fb5c5f4d401925f8b5Tyler Gunn     */
5497fa8ac39602ee9841dfcb0fb5c5f4d401925f8b5Tyler Gunn    public void setAudioQuality(int audioQuality) {
5507fa8ac39602ee9841dfcb0fb5c5f4d401925f8b5Tyler Gunn        mAudioQuality = audioQuality;
5517fa8ac39602ee9841dfcb0fb5c5f4d401925f8b5Tyler Gunn        for (Listener l : mListeners) {
5527fa8ac39602ee9841dfcb0fb5c5f4d401925f8b5Tyler Gunn            l.onAudioQualityChanged(mAudioQuality);
5537fa8ac39602ee9841dfcb0fb5c5f4d401925f8b5Tyler Gunn        }
5547fa8ac39602ee9841dfcb0fb5c5f4d401925f8b5Tyler Gunn    }
5557fa8ac39602ee9841dfcb0fb5c5f4d401925f8b5Tyler Gunn
5567fa8ac39602ee9841dfcb0fb5c5f4d401925f8b5Tyler Gunn    /**
557dc2b5d1c32cad5269106d00fd106bd64097238f4Tyler Gunn     * Sets the {@link android.telecom.Connection.VideoProvider} for the connection.
5582999afbcfeab69bf7473e1b9bcabb1c9c6935b19Tyler Gunn     *
559d5c5a168b4f5806701a4d146309c996acca7183dIhab Awad     * @param videoProvider The video call provider.
5602999afbcfeab69bf7473e1b9bcabb1c9c6935b19Tyler Gunn     */
561dc2b5d1c32cad5269106d00fd106bd64097238f4Tyler Gunn    public void setVideoProvider(android.telecom.Connection.VideoProvider videoProvider) {
562d5c5a168b4f5806701a4d146309c996acca7183dIhab Awad        mVideoProvider = videoProvider;
5632999afbcfeab69bf7473e1b9bcabb1c9c6935b19Tyler Gunn        for (Listener l : mListeners) {
564d5c5a168b4f5806701a4d146309c996acca7183dIhab Awad            l.onVideoProviderChanged(mVideoProvider);
5652999afbcfeab69bf7473e1b9bcabb1c9c6935b19Tyler Gunn        }
5662999afbcfeab69bf7473e1b9bcabb1c9c6935b19Tyler Gunn    }
5672999afbcfeab69bf7473e1b9bcabb1c9c6935b19Tyler Gunn
5682d265969ca301ba3720458ea9da2ec8d6a18bb8dXia Ying    public void setConverted(String oriNumber) {
5692d265969ca301ba3720458ea9da2ec8d6a18bb8dXia Ying        mNumberConverted = true;
5702d265969ca301ba3720458ea9da2ec8d6a18bb8dXia Ying        mConvertedNumber = mAddress;
5712d265969ca301ba3720458ea9da2ec8d6a18bb8dXia Ying        mAddress = oriNumber;
5722d265969ca301ba3720458ea9da2ec8d6a18bb8dXia Ying        mDialString = oriNumber;
5732d265969ca301ba3720458ea9da2ec8d6a18bb8dXia Ying    }
5742d265969ca301ba3720458ea9da2ec8d6a18bb8dXia Ying
5752999afbcfeab69bf7473e1b9bcabb1c9c6935b19Tyler Gunn    /**
576f53559f13dc272115f27f3b23955933da45ce127Tyler Gunn     * Notifies listeners of a change to conference participant(s).
577fdca22cc56b0e1ef1504e36a5aacb2ebbc4d146cTyler Gunn     *
578f53559f13dc272115f27f3b23955933da45ce127Tyler Gunn     * @param conferenceParticipants The participant(s).
579fdca22cc56b0e1ef1504e36a5aacb2ebbc4d146cTyler Gunn     */
580f53559f13dc272115f27f3b23955933da45ce127Tyler Gunn    public void updateConferenceParticipants(List<ConferenceParticipant> conferenceParticipants) {
581fdca22cc56b0e1ef1504e36a5aacb2ebbc4d146cTyler Gunn        for (Listener l : mListeners) {
582f53559f13dc272115f27f3b23955933da45ce127Tyler Gunn            l.onConferenceParticipantsChanged(conferenceParticipants);
583fdca22cc56b0e1ef1504e36a5aacb2ebbc4d146cTyler Gunn        }
584fdca22cc56b0e1ef1504e36a5aacb2ebbc4d146cTyler Gunn    }
585fdca22cc56b0e1ef1504e36a5aacb2ebbc4d146cTyler Gunn
586fdca22cc56b0e1ef1504e36a5aacb2ebbc4d146cTyler Gunn    /**
587d7f4ed8ac190763dce7e57b737caa44654b4592aTyler Gunn     * Notifies this Connection of a request to disconnect a participant of the conference managed
588d7f4ed8ac190763dce7e57b737caa44654b4592aTyler Gunn     * by the connection.
589d7f4ed8ac190763dce7e57b737caa44654b4592aTyler Gunn     *
590d7f4ed8ac190763dce7e57b737caa44654b4592aTyler Gunn     * @param endpoint the {@link Uri} of the participant to disconnect.
591d7f4ed8ac190763dce7e57b737caa44654b4592aTyler Gunn     */
592d7f4ed8ac190763dce7e57b737caa44654b4592aTyler Gunn    public void onDisconnectConferenceParticipant(Uri endpoint) {
593d7f4ed8ac190763dce7e57b737caa44654b4592aTyler Gunn    }
594d7f4ed8ac190763dce7e57b737caa44654b4592aTyler Gunn
595d7f4ed8ac190763dce7e57b737caa44654b4592aTyler Gunn    /**
5960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Build a human representation of a connection instance, suitable for debugging.
5970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Don't log personal stuff unless in debug mode.
5980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @return a string representing the internal state of this connection.
5990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
6000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public String toString() {
6010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        StringBuilder str = new StringBuilder(128);
6020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
60399c2e1d6749cfad2a8ca94a47857d8c3bfc09454Wink Saville        if (Rlog.isLoggable(LOG_TAG, Log.DEBUG)) {
6040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            str.append("addr: " + getAddress())
6050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    .append(" pres.: " + getNumberPresentation())
6060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    .append(" dial: " + getOrigDialString())
6070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    .append(" postdial: " + getRemainingPostDialString())
6080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    .append(" cnap name: " + getCnapName())
6090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    .append("(" + getCnapNamePresentation() + ")");
6100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
6110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        str.append(" incoming: " + isIncoming())
6120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                .append(" state: " + getState())
6130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                .append(" post dial state: " + getPostDialState());
6140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return str.toString();
6150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
6160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville}
617