Connection.java revision 4567a0789e9966929c71af9a2c3866582c85c9e0
1e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee/*
2e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee * Copyright (C) 2006 The Android Open Source Project
3e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee *
4e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee * Licensed under the Apache License, Version 2.0 (the "License");
5e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee * you may not use this file except in compliance with the License.
6e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee * You may obtain a copy of the License at
7e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee *
8e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee *      http://www.apache.org/licenses/LICENSE-2.0
9e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee *
10e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee * Unless required by applicable law or agreed to in writing, software
11e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee * distributed under the License is distributed on an "AS IS" BASIS,
12e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee * See the License for the specific language governing permissions and
14e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee * limitations under the License.
15e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee */
16e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee
177940e44f4517de5e2634a7e07d58d0fb26160513Brian Carlstrompackage com.android.internal.telephony;
184f6ad8ab428038129b2d0d6c40b7fd625cca15e1Ian Rogers
190c7abda482f53db3d153c073d1c7a145f84e0626Ian Rogersimport android.net.Uri;
2092cf83e001357329cbf41fa15a6e053fab6f4933Nicolas Geoffrayimport android.os.SystemClock;
2196faf5b363d922ae91cf25404dee0e87c740c7c5Ian Rogersimport android.telecom.ConferenceParticipant;
228d3a117b374352a1853fae9b7306afeaaa9e3b91Ian Rogersimport android.telephony.Rlog;
235816ed48bc339c983b40dc493e96b97821ce7966Vladimir Markoimport android.util.Log;
245816ed48bc339c983b40dc493e96b97821ce7966Vladimir Marko
25c7f832061fea59fd6abd125f26c8ca1faec695a5Vladimir Markoimport java.lang.Override;
262730db03beee4d6687ddfb5000c33c0370fbc6ebVladimir Markoimport java.util.ArrayList;
270c7abda482f53db3d153c073d1c7a145f84e0626Ian Rogersimport java.util.List;
280c7abda482f53db3d153c073d1c7a145f84e0626Ian Rogersimport java.util.Set;
292e589aa58a1372909f95e731fd6b8895f6359c3aVladimir Markoimport java.util.concurrent.CopyOnWriteArraySet;
300c7abda482f53db3d153c073d1c7a145f84e0626Ian Rogers
31e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee/**
32e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee * {@hide}
3306606b9c4a1c00154ed15f719ad8ea994e54ee8eVladimir Marko */
3406606b9c4a1c00154ed15f719ad8ea994e54ee8eVladimir Markopublic abstract class Connection {
3506606b9c4a1c00154ed15f719ad8ea994e54ee8eVladimir Marko    public interface PostDialListener {
3606606b9c4a1c00154ed15f719ad8ea994e54ee8eVladimir Marko        void onPostDialWait();
3706606b9c4a1c00154ed15f719ad8ea994e54ee8eVladimir Marko        void onPostDialChar(char c);
3806606b9c4a1c00154ed15f719ad8ea994e54ee8eVladimir Marko    }
3906606b9c4a1c00154ed15f719ad8ea994e54ee8eVladimir Marko
40107c31e598b649a8bb8d959d6a0377937e63e624Ian Rogers    /**
4106606b9c4a1c00154ed15f719ad8ea994e54ee8eVladimir Marko     * Listener interface for events related to the connection which should be reported to the
4206606b9c4a1c00154ed15f719ad8ea994e54ee8eVladimir Marko     * {@link android.telecom.Connection}.
4306606b9c4a1c00154ed15f719ad8ea994e54ee8eVladimir Marko     */
4406606b9c4a1c00154ed15f719ad8ea994e54ee8eVladimir Marko    public interface Listener {
4506606b9c4a1c00154ed15f719ad8ea994e54ee8eVladimir Marko        public void onVideoStateChanged(int videoState);
4606606b9c4a1c00154ed15f719ad8ea994e54ee8eVladimir Marko        public void onLocalVideoCapabilityChanged(boolean capable);
4706606b9c4a1c00154ed15f719ad8ea994e54ee8eVladimir Marko        public void onRemoteVideoCapabilityChanged(boolean capable);
4806606b9c4a1c00154ed15f719ad8ea994e54ee8eVladimir Marko        public void onVideoProviderChanged(
4906606b9c4a1c00154ed15f719ad8ea994e54ee8eVladimir Marko                android.telecom.Connection.VideoProvider videoProvider);
5006606b9c4a1c00154ed15f719ad8ea994e54ee8eVladimir Marko        public void onAudioQualityChanged(int audioQuality);
5106606b9c4a1c00154ed15f719ad8ea994e54ee8eVladimir Marko        public void onConferenceParticipantsChanged(List<ConferenceParticipant> participants);
5206606b9c4a1c00154ed15f719ad8ea994e54ee8eVladimir Marko    }
5306606b9c4a1c00154ed15f719ad8ea994e54ee8eVladimir Marko
5406606b9c4a1c00154ed15f719ad8ea994e54ee8eVladimir Marko    /**
552ce745c06271d5223d57dbf08117b20d5b60694aBrian Carlstrom     * Base listener implementation.
564ef3e45d7c6ec3c482a1a48f4df470811aa3cf0abuzbee     */
574ef3e45d7c6ec3c482a1a48f4df470811aa3cf0abuzbee    public abstract static class ListenerBase implements Listener {
584ef3e45d7c6ec3c482a1a48f4df470811aa3cf0abuzbee        @Override
594ef3e45d7c6ec3c482a1a48f4df470811aa3cf0abuzbee        public void onVideoStateChanged(int videoState) {}
601fd3346740dfb7f47be9922312b68a4227fada96buzbee        @Override
614ef3e45d7c6ec3c482a1a48f4df470811aa3cf0abuzbee        public void onLocalVideoCapabilityChanged(boolean capable) {}
621fd3346740dfb7f47be9922312b68a4227fada96buzbee        @Override
634ef3e45d7c6ec3c482a1a48f4df470811aa3cf0abuzbee        public void onRemoteVideoCapabilityChanged(boolean capable) {}
644ef3e45d7c6ec3c482a1a48f4df470811aa3cf0abuzbee        @Override
654ef3e45d7c6ec3c482a1a48f4df470811aa3cf0abuzbee        public void onVideoProviderChanged(
661fd3346740dfb7f47be9922312b68a4227fada96buzbee                android.telecom.Connection.VideoProvider videoProvider) {}
674ef3e45d7c6ec3c482a1a48f4df470811aa3cf0abuzbee        @Override
681fd3346740dfb7f47be9922312b68a4227fada96buzbee        public void onAudioQualityChanged(int audioQuality) {}
694ef3e45d7c6ec3c482a1a48f4df470811aa3cf0abuzbee        @Override
704ef3e45d7c6ec3c482a1a48f4df470811aa3cf0abuzbee        public void onConferenceParticipantsChanged(List<ConferenceParticipant> participants) {}
714ef3e45d7c6ec3c482a1a48f4df470811aa3cf0abuzbee    }
724ef3e45d7c6ec3c482a1a48f4df470811aa3cf0abuzbee
734ef3e45d7c6ec3c482a1a48f4df470811aa3cf0abuzbee    public static final int AUDIO_QUALITY_STANDARD = 1;
744ef3e45d7c6ec3c482a1a48f4df470811aa3cf0abuzbee    public static final int AUDIO_QUALITY_HIGH_DEFINITION = 2;
752ce745c06271d5223d57dbf08117b20d5b60694aBrian Carlstrom
76b48819db07f9a0992a72173380c24249d7fc648abuzbee    //Caller Name Display
778dea81ca9c0201ceaa88086b927a5838a06a3e69Vladimir Marko    protected String mCnapName;
781fd3346740dfb7f47be9922312b68a4227fada96buzbee    protected int mCnapNamePresentation  = PhoneConstants.PRESENTATION_ALLOWED;
798dea81ca9c0201ceaa88086b927a5838a06a3e69Vladimir Marko    protected String mAddress;     // MAY BE NULL!!!
8002031b185b4653e6c72e21f7a51238b903f6d638buzbee    protected String mDialString;          // outgoing calls only
8102031b185b4653e6c72e21f7a51238b903f6d638buzbee    protected int mNumberPresentation = PhoneConstants.PRESENTATION_ALLOWED;
823c12c512faf6837844d5465b23b9410889e5eb11Andreas Gampe    protected boolean mIsIncoming;
833c12c512faf6837844d5465b23b9410889e5eb11Andreas Gampe    /*
843c12c512faf6837844d5465b23b9410889e5eb11Andreas Gampe     * These time/timespan values are based on System.currentTimeMillis(),
853c12c512faf6837844d5465b23b9410889e5eb11Andreas Gampe     * i.e., "wall clock" time.
863c12c512faf6837844d5465b23b9410889e5eb11Andreas Gampe     */
873c12c512faf6837844d5465b23b9410889e5eb11Andreas Gampe    protected long mCreateTime;
883c12c512faf6837844d5465b23b9410889e5eb11Andreas Gampe    protected long mConnectTime;
893c12c512faf6837844d5465b23b9410889e5eb11Andreas Gampe    /*
903c12c512faf6837844d5465b23b9410889e5eb11Andreas Gampe     * These time/timespan values are based on SystemClock.elapsedRealTime(),
913c12c512faf6837844d5465b23b9410889e5eb11Andreas Gampe     * i.e., time since boot.  They are appropriate for comparison and
923c12c512faf6837844d5465b23b9410889e5eb11Andreas Gampe     * calculating deltas.
933c12c512faf6837844d5465b23b9410889e5eb11Andreas Gampe     */
943c12c512faf6837844d5465b23b9410889e5eb11Andreas Gampe    protected long mConnectTimeReal;
953c12c512faf6837844d5465b23b9410889e5eb11Andreas Gampe    protected long mDuration;
96252254b130067cd7a5071865e793966871ae0246buzbee    protected long mHoldingStartTime;  // The time when the Connection last transitioned
97252254b130067cd7a5071865e793966871ae0246buzbee                            // into HOLDING
98252254b130067cd7a5071865e793966871ae0246buzbee    protected Connection mOrigConnection;
99252254b130067cd7a5071865e793966871ae0246buzbee    private List<PostDialListener> mPostDialListeners = new ArrayList<>();
100252254b130067cd7a5071865e793966871ae0246buzbee    public Set<Listener> mListeners = new CopyOnWriteArraySet<>();
101252254b130067cd7a5071865e793966871ae0246buzbee
102252254b130067cd7a5071865e793966871ae0246buzbee    protected boolean mNumberConverted = false;
103252254b130067cd7a5071865e793966871ae0246buzbee    protected String mConvertedNumber;
104252254b130067cd7a5071865e793966871ae0246buzbee
105252254b130067cd7a5071865e793966871ae0246buzbee    private static String LOG_TAG = "Connection";
106252254b130067cd7a5071865e793966871ae0246buzbee
107252254b130067cd7a5071865e793966871ae0246buzbee    Object mUserData;
108252254b130067cd7a5071865e793966871ae0246buzbee    private int mVideoState;
109252254b130067cd7a5071865e793966871ae0246buzbee    private boolean mLocalVideoCapable;
110252254b130067cd7a5071865e793966871ae0246buzbee    private boolean mRemoteVideoCapable;
111252254b130067cd7a5071865e793966871ae0246buzbee    private int mAudioQuality;
112252254b130067cd7a5071865e793966871ae0246buzbee    private android.telecom.Connection.VideoProvider mVideoProvider;
113252254b130067cd7a5071865e793966871ae0246buzbee    public Call.State mPreHandoverState = Call.State.IDLE;
114252254b130067cd7a5071865e793966871ae0246buzbee
115252254b130067cd7a5071865e793966871ae0246buzbee    /* Instance Methods */
116cbd6d44c0a94f3d26671b5325aa21bbf1335ffe8buzbee
117df62950e7a32031b82360c407d46a37b94188fbbBrian Carlstrom    /**
118fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee     * Gets address (e.g. phone number) associated with connection.
119252254b130067cd7a5071865e793966871ae0246buzbee     * TODO: distinguish reasons for unavailability
120252254b130067cd7a5071865e793966871ae0246buzbee     *
121252254b130067cd7a5071865e793966871ae0246buzbee     * @return address or null if unavailable
122cbd6d44c0a94f3d26671b5325aa21bbf1335ffe8buzbee     */
123cbd6d44c0a94f3d26671b5325aa21bbf1335ffe8buzbee
1242ce745c06271d5223d57dbf08117b20d5b60694aBrian Carlstrom    public String getAddress() {
1251fd3346740dfb7f47be9922312b68a4227fada96buzbee        return mAddress;
126b48819db07f9a0992a72173380c24249d7fc648abuzbee    }
1278dea81ca9c0201ceaa88086b927a5838a06a3e69Vladimir Marko
1288dea81ca9c0201ceaa88086b927a5838a06a3e69Vladimir Marko    /**
1298dea81ca9c0201ceaa88086b927a5838a06a3e69Vladimir Marko     * Gets CNAP name associated with connection.
130fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee     * @return cnap name or null if unavailable
131b48819db07f9a0992a72173380c24249d7fc648abuzbee     */
132a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    public String getCnapName() {
133b48819db07f9a0992a72173380c24249d7fc648abuzbee        return mCnapName;
134a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    }
1358dea81ca9c0201ceaa88086b927a5838a06a3e69Vladimir Marko
136a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    /**
1378dea81ca9c0201ceaa88086b927a5838a06a3e69Vladimir Marko     * Get original dial string.
138a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee     * @return original dial string or null if unavailable
139fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee     */
1408dea81ca9c0201ceaa88086b927a5838a06a3e69Vladimir Marko    public String getOrigDialString(){
141fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee        return null;
1428dea81ca9c0201ceaa88086b927a5838a06a3e69Vladimir Marko    }
143a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
1448dea81ca9c0201ceaa88086b927a5838a06a3e69Vladimir Marko    /**
1458dea81ca9c0201ceaa88086b927a5838a06a3e69Vladimir Marko     * Gets CNAP presentation associated with connection.
146a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee     * @return cnap name or null if unavailable
1478dea81ca9c0201ceaa88086b927a5838a06a3e69Vladimir Marko     */
1488dea81ca9c0201ceaa88086b927a5838a06a3e69Vladimir Marko
149a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    public int getCnapNamePresentation() {
1508dea81ca9c0201ceaa88086b927a5838a06a3e69Vladimir Marko       return mCnapNamePresentation;
151a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    }
1521fd3346740dfb7f47be9922312b68a4227fada96buzbee
1538dea81ca9c0201ceaa88086b927a5838a06a3e69Vladimir Marko    /**
154a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee     * @return Call that owns this Connection, or null if none
155a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee     */
156fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee    public abstract Call getCall();
157a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
1588dea81ca9c0201ceaa88086b927a5838a06a3e69Vladimir Marko    /**
15931a4a6f5717f645da6b97ccc1e420ae1e1c71ce0buzbee     * Connection create time in currentTimeMillis() format
16031a4a6f5717f645da6b97ccc1e420ae1e1c71ce0buzbee     * Basically, set when object is created.
16131a4a6f5717f645da6b97ccc1e420ae1e1c71ce0buzbee     * Effectively, when an incoming call starts ringing or an
162b5d09b2f87202bc132ac3991d4b6d71f4f6d9264Ian Rogers     * outgoing call starts dialing
16331a4a6f5717f645da6b97ccc1e420ae1e1c71ce0buzbee     */
1641fd3346740dfb7f47be9922312b68a4227fada96buzbee    public long getCreateTime() {
1652ce745c06271d5223d57dbf08117b20d5b60694aBrian Carlstrom        return mCreateTime;
1668dea81ca9c0201ceaa88086b927a5838a06a3e69Vladimir Marko    }
1678dea81ca9c0201ceaa88086b927a5838a06a3e69Vladimir Marko
16831a4a6f5717f645da6b97ccc1e420ae1e1c71ce0buzbee    /**
169a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee     * Connection connect time in currentTimeMillis() format.
170fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee     * For outgoing calls: Begins at (DIALING|ALERTING) -> ACTIVE transition.
171a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee     * For incoming calls: Begins at (INCOMING|WAITING) -> ACTIVE transition.
172a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee     * Returns 0 before then.
173b48819db07f9a0992a72173380c24249d7fc648abuzbee     */
17431a4a6f5717f645da6b97ccc1e420ae1e1c71ce0buzbee    public long getConnectTime() {
17531a4a6f5717f645da6b97ccc1e420ae1e1c71ce0buzbee        return mConnectTime;
17631a4a6f5717f645da6b97ccc1e420ae1e1c71ce0buzbee    }
1775de3494e4297c0d480409da3fecee39173f1d4e1buzbee
1785de3494e4297c0d480409da3fecee39173f1d4e1buzbee    /**
1795de3494e4297c0d480409da3fecee39173f1d4e1buzbee     * Connection connect time in elapsedRealtime() format.
1805de3494e4297c0d480409da3fecee39173f1d4e1buzbee     * For outgoing calls: Begins at (DIALING|ALERTING) -> ACTIVE transition.
1815de3494e4297c0d480409da3fecee39173f1d4e1buzbee     * For incoming calls: Begins at (INCOMING|WAITING) -> ACTIVE transition.
1822ce745c06271d5223d57dbf08117b20d5b60694aBrian Carlstrom     * Returns 0 before then.
183a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee     */
184a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    public long getConnectTimeReal() {
1851fd3346740dfb7f47be9922312b68a4227fada96buzbee        return mConnectTimeReal;
186a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    }
187a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
188a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    /**
189a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee     * Disconnect time in currentTimeMillis() format.
190a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee     * The time when this Connection makes a transition into ENDED or FAIL.
1911fd3346740dfb7f47be9922312b68a4227fada96buzbee     * Returns 0 before then.
192a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee     */
193a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    public abstract long getDisconnectTime();
194a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
195a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    /**
196a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee     * Returns the number of milliseconds the call has been connected,
197a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee     * or 0 if the call has never connected.
198a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee     * If the call is still connected, then returns the elapsed
199a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee     * time since connect.
200a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee     */
201a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    public long getDurationMillis() {
202a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee        if (mConnectTimeReal == 0) {
2034ef3e45d7c6ec3c482a1a48f4df470811aa3cf0abuzbee            return 0;
2040d82948094d9a198e01aa95f64012bdedd5b6fc9buzbee        } else if (mDuration == 0) {
2050d82948094d9a198e01aa95f64012bdedd5b6fc9buzbee            return SystemClock.elapsedRealtime() - mConnectTimeReal;
2064ef3e45d7c6ec3c482a1a48f4df470811aa3cf0abuzbee        } else {
207a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee            return mDuration;
2080b1191cfece83f6f8d4101575a06555a2d13387aBill Buzbee        }
2090b1191cfece83f6f8d4101575a06555a2d13387aBill Buzbee    }
210a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
211a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    /**
212a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee     * The time when this Connection last transitioned into HOLDING
213a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee     * in elapsedRealtime() format.
214a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee     * Returns 0, if it has never made a transition into HOLDING.
215fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee     */
216a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    public long getHoldingStartTime() {
217a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee        return mHoldingStartTime;
218a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    }
219a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
220a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    /**
221a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee     * If this connection is HOLDING, return the number of milliseconds
222a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee     * that it has been on hold for (approximately).
223cbd6d44c0a94f3d26671b5325aa21bbf1335ffe8buzbee     * If this connection is in any other state, return 0.
224a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee     */
225a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
226cbd6d44c0a94f3d26671b5325aa21bbf1335ffe8buzbee    public abstract long getHoldDurationMillis();
227a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
228a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    /**
229cbd6d44c0a94f3d26671b5325aa21bbf1335ffe8buzbee     * Returns call disconnect cause. Values are defined in
230a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee     * {@link android.telephony.DisconnectCause}. If the call is not yet
231a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee     * disconnected, NOT_DISCONNECTED is returned.
232cbd6d44c0a94f3d26671b5325aa21bbf1335ffe8buzbee     */
233a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    public abstract int getDisconnectCause();
2348320f3867c02bae9bef6cdab267820cb7b412781buzbee
235fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee    /**
2368320f3867c02bae9bef6cdab267820cb7b412781buzbee     * Returns true of this connection originated elsewhere
237a5b3024aed77a8204d5fb48ba7f763fb8c60fa76Bill Buzbee     * ("MT" or mobile terminated; another party called this terminal)
238fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee     * or false if this call originated here (MO or mobile originated).
239a5b3024aed77a8204d5fb48ba7f763fb8c60fa76Bill Buzbee     */
240a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    public boolean isIncoming() {
241cbd6d44c0a94f3d26671b5325aa21bbf1335ffe8buzbee        return mIsIncoming;
242a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    }
243a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
244a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    /**
245a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee     * If this Connection is connected, then it is associated with
246fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee     * a Call.
247a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee     *
248a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee     * Returns getCall().getState() or Call.State.IDLE if not
2491fd3346740dfb7f47be9922312b68a4227fada96buzbee     * connected
25002031b185b4653e6c72e21f7a51238b903f6d638buzbee     */
2511fd3346740dfb7f47be9922312b68a4227fada96buzbee    public Call.State getState() {
25202031b185b4653e6c72e21f7a51238b903f6d638buzbee        Call c;
253107c31e598b649a8bb8d959d6a0377937e63e624Ian Rogers
254107c31e598b649a8bb8d959d6a0377937e63e624Ian Rogers        c = getCall();
255a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
256fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee        if (c == null) {
257a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee            return Call.State.IDLE;
258a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee        } else {
259a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee            return c.getState();
260a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee        }
261b48819db07f9a0992a72173380c24249d7fc648abuzbee    }
2628dea81ca9c0201ceaa88086b927a5838a06a3e69Vladimir Marko
263a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    /**
264b48819db07f9a0992a72173380c24249d7fc648abuzbee     * If this connection went through handover return the state of the
2658dea81ca9c0201ceaa88086b927a5838a06a3e69Vladimir Marko     * call that contained this connection before handover.
266a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee     */
2675de3494e4297c0d480409da3fecee39173f1d4e1buzbee    public Call.State getStateBeforeHandover() {
2685de3494e4297c0d480409da3fecee39173f1d4e1buzbee        return mPreHandoverState;
2692ce745c06271d5223d57dbf08117b20d5b60694aBrian Carlstrom    }
270da7a69b3fa7bb22d087567364b7eb5a75824efd8Razvan A Lupusoru
271fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee    /**
2721fd3346740dfb7f47be9922312b68a4227fada96buzbee     * isAlive()
273a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee     *
274fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee     * @return true if the connection isn't disconnected
275b5860fb459f1ed71f39d8a87b45bee6727d79fe8buzbee     * (could be active, holding, ringing, dialing, etc)
276a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee     */
2779c044ce5f76e9bfa17c4c1979e9f8c99ae100695buzbee    public boolean
278a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    isAlive() {
2791fd3346740dfb7f47be9922312b68a4227fada96buzbee        return getState().isAlive();
280a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    }
2811fd3346740dfb7f47be9922312b68a4227fada96buzbee
282a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    /**
283a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee     * Returns true if Connection is connected and is INCOMING or WAITING
2841fd3346740dfb7f47be9922312b68a4227fada96buzbee     */
2855de3494e4297c0d480409da3fecee39173f1d4e1buzbee    public boolean
286a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    isRinging() {
287a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee        return getState().isRinging();
288fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee    }
289fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee
2901fd3346740dfb7f47be9922312b68a4227fada96buzbee    /**
291a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee     *
292a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee     * @return the userdata set in setUserData()
2935de3494e4297c0d480409da3fecee39173f1d4e1buzbee     */
2945de3494e4297c0d480409da3fecee39173f1d4e1buzbee    public Object getUserData() {
2957a11ab09f93f54b1c07c0bf38dd65ed322e86bc6buzbee        return mUserData;
2967a11ab09f93f54b1c07c0bf38dd65ed322e86bc6buzbee    }
2977a11ab09f93f54b1c07c0bf38dd65ed322e86bc6buzbee
2987a11ab09f93f54b1c07c0bf38dd65ed322e86bc6buzbee    /**
2997a11ab09f93f54b1c07c0bf38dd65ed322e86bc6buzbee     *
3007a11ab09f93f54b1c07c0bf38dd65ed322e86bc6buzbee     * @param userdata user can store an any userdata in the Connection object.
3017a11ab09f93f54b1c07c0bf38dd65ed322e86bc6buzbee     */
3027a11ab09f93f54b1c07c0bf38dd65ed322e86bc6buzbee    public void setUserData(Object userdata) {
3037a11ab09f93f54b1c07c0bf38dd65ed322e86bc6buzbee        mUserData = userdata;
3047a11ab09f93f54b1c07c0bf38dd65ed322e86bc6buzbee    }
3057a11ab09f93f54b1c07c0bf38dd65ed322e86bc6buzbee
3067a11ab09f93f54b1c07c0bf38dd65ed322e86bc6buzbee    /**
3077a11ab09f93f54b1c07c0bf38dd65ed322e86bc6buzbee     * Hangup individual Connection
3085de3494e4297c0d480409da3fecee39173f1d4e1buzbee     */
3092ce745c06271d5223d57dbf08117b20d5b60694aBrian Carlstrom    public abstract void hangup() throws CallStateException;
310a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
3111fd3346740dfb7f47be9922312b68a4227fada96buzbee    /**
312fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee     * Separate this call from its owner Call and assigns it to a new Call
3131fd3346740dfb7f47be9922312b68a4227fada96buzbee     * (eg if it is currently part of a Conference call
3141fd3346740dfb7f47be9922312b68a4227fada96buzbee     * TODO: Throw exception? Does GSM require error display on failure here?
3151fd3346740dfb7f47be9922312b68a4227fada96buzbee     */
3161fd3346740dfb7f47be9922312b68a4227fada96buzbee    public abstract void separate() throws CallStateException;
3171fd3346740dfb7f47be9922312b68a4227fada96buzbee
3181fd3346740dfb7f47be9922312b68a4227fada96buzbee    public enum PostDialState {
3191fd3346740dfb7f47be9922312b68a4227fada96buzbee        NOT_STARTED,    /* The post dial string playback hasn't
320da7a69b3fa7bb22d087567364b7eb5a75824efd8Razvan A Lupusoru                           been started, or this call is not yet
3211fd3346740dfb7f47be9922312b68a4227fada96buzbee                           connected, or this is an incoming call */
3221fd3346740dfb7f47be9922312b68a4227fada96buzbee        STARTED,        /* The post dial string playback has begun */
323fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee        WAIT,           /* The post dial string playback is waiting for a
324a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee                           call to proceedAfterWaitChar() */
3251fd3346740dfb7f47be9922312b68a4227fada96buzbee        WILD,           /* The post dial string playback is waiting for a
3261fd3346740dfb7f47be9922312b68a4227fada96buzbee                           call to proceedAfterWildChar() */
3277a11ab09f93f54b1c07c0bf38dd65ed322e86bc6buzbee        COMPLETE,       /* The post dial string playback is complete */
3281fd3346740dfb7f47be9922312b68a4227fada96buzbee        CANCELLED,       /* The post dial string playback was cancelled
3291fd3346740dfb7f47be9922312b68a4227fada96buzbee                           with cancelPostDial() */
330a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee        PAUSE           /* The post dial string playback is pausing for a
3311fd3346740dfb7f47be9922312b68a4227fada96buzbee                           call to processNextPostDialChar*/
332fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee    }
333fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee
334a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    public void clearUserData(){
335a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee        mUserData = null;
336a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    }
3371fd3346740dfb7f47be9922312b68a4227fada96buzbee
338d91d6d6a80748f277fd938a412211e5af28913b1Ian Rogers    public final void addPostDialListener(PostDialListener listener) {
339d91d6d6a80748f277fd938a412211e5af28913b1Ian Rogers        if (!mPostDialListeners.contains(listener)) {
340d91d6d6a80748f277fd938a412211e5af28913b1Ian Rogers            mPostDialListeners.add(listener);
341a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee        }
342a5b3024aed77a8204d5fb48ba7f763fb8c60fa76Bill Buzbee    }
34306606b9c4a1c00154ed15f719ad8ea994e54ee8eVladimir Marko
34406606b9c4a1c00154ed15f719ad8ea994e54ee8eVladimir Marko    protected final void clearPostDialListeners() {
34506606b9c4a1c00154ed15f719ad8ea994e54ee8eVladimir Marko        mPostDialListeners.clear();
34606606b9c4a1c00154ed15f719ad8ea994e54ee8eVladimir Marko    }
34706606b9c4a1c00154ed15f719ad8ea994e54ee8eVladimir Marko
34806606b9c4a1c00154ed15f719ad8ea994e54ee8eVladimir Marko    protected final void notifyPostDialListeners() {
34906606b9c4a1c00154ed15f719ad8ea994e54ee8eVladimir Marko        if (getPostDialState() == PostDialState.WAIT) {
3505de3494e4297c0d480409da3fecee39173f1d4e1buzbee            for (PostDialListener listener : new ArrayList<>(mPostDialListeners)) {
3515de3494e4297c0d480409da3fecee39173f1d4e1buzbee                listener.onPostDialWait();
35231a4a6f5717f645da6b97ccc1e420ae1e1c71ce0buzbee            }
35331a4a6f5717f645da6b97ccc1e420ae1e1c71ce0buzbee        }
35431a4a6f5717f645da6b97ccc1e420ae1e1c71ce0buzbee    }
35531a4a6f5717f645da6b97ccc1e420ae1e1c71ce0buzbee
3562ce745c06271d5223d57dbf08117b20d5b60694aBrian Carlstrom    protected final void notifyPostDialListenersNextChar(char c) {
357fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee        for (PostDialListener listener : new ArrayList<>(mPostDialListeners)) {
358fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee            listener.onPostDialChar(c);
359fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee        }
360fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee    }
361a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
362a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    public abstract PostDialState getPostDialState();
36331a4a6f5717f645da6b97ccc1e420ae1e1c71ce0buzbee
36431a4a6f5717f645da6b97ccc1e420ae1e1c71ce0buzbee    /**
36531a4a6f5717f645da6b97ccc1e420ae1e1c71ce0buzbee     * Returns the portion of the post dial string that has not
3662ce745c06271d5223d57dbf08117b20d5b60694aBrian Carlstrom     * yet been dialed, or "" if none
367fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee     */
368fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee    public abstract String getRemainingPostDialString();
369fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee
370fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee    /**
3714ef3e45d7c6ec3c482a1a48f4df470811aa3cf0abuzbee     * See Phone.setOnPostDialWaitCharacter()
3724ef3e45d7c6ec3c482a1a48f4df470811aa3cf0abuzbee     */
373fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee
37431a4a6f5717f645da6b97ccc1e420ae1e1c71ce0buzbee    public abstract void proceedAfterWaitChar();
375fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee
376fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee    /**
377fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee     * See Phone.setOnPostDialWildCharacter()
378fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee     */
379a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    public abstract void proceedAfterWildChar(String str);
380fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee    /**
381a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee     * Cancel any post
382a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee     */
38331a4a6f5717f645da6b97ccc1e420ae1e1c71ce0buzbee    public abstract void cancelPostDial();
38431a4a6f5717f645da6b97ccc1e420ae1e1c71ce0buzbee
385a51a0b0300268b605e3ad71b0e87ff394032c5e7Vladimir Marko    /**
386a51a0b0300268b605e3ad71b0e87ff394032c5e7Vladimir Marko     * Returns the caller id presentation type for incoming and waiting calls
387a51a0b0300268b605e3ad71b0e87ff394032c5e7Vladimir Marko     * @return one of PRESENTATION_*
388a51a0b0300268b605e3ad71b0e87ff394032c5e7Vladimir Marko     */
389a51a0b0300268b605e3ad71b0e87ff394032c5e7Vladimir Marko    public abstract int getNumberPresentation();
390a51a0b0300268b605e3ad71b0e87ff394032c5e7Vladimir Marko
391a51a0b0300268b605e3ad71b0e87ff394032c5e7Vladimir Marko    /**
392a51a0b0300268b605e3ad71b0e87ff394032c5e7Vladimir Marko     * Returns the User to User Signaling (UUS) information associated with
393a51a0b0300268b605e3ad71b0e87ff394032c5e7Vladimir Marko     * incoming and waiting calls
394a51a0b0300268b605e3ad71b0e87ff394032c5e7Vladimir Marko     * @return UUSInfo containing the UUS userdata.
395a51a0b0300268b605e3ad71b0e87ff394032c5e7Vladimir Marko     */
396a51a0b0300268b605e3ad71b0e87ff394032c5e7Vladimir Marko    public abstract UUSInfo getUUSInfo();
39731a4a6f5717f645da6b97ccc1e420ae1e1c71ce0buzbee
39831a4a6f5717f645da6b97ccc1e420ae1e1c71ce0buzbee    /**
39931a4a6f5717f645da6b97ccc1e420ae1e1c71ce0buzbee     * Returns the CallFail reason provided by the RIL with the result of
40031a4a6f5717f645da6b97ccc1e420ae1e1c71ce0buzbee     * RIL_REQUEST_LAST_CALL_FAIL_CAUSE
40131a4a6f5717f645da6b97ccc1e420ae1e1c71ce0buzbee     */
4024ef3e45d7c6ec3c482a1a48f4df470811aa3cf0abuzbee    public abstract int getPreciseDisconnectCause();
4032ce745c06271d5223d57dbf08117b20d5b60694aBrian Carlstrom
404a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    /**
405fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee     * Returns the original Connection instance associated with
40683cc7ae96d4176533dd0391a1591d321b0a87f4fVladimir Marko     * this Connection
407fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee     */
408fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee    public Connection getOrigConnection() {
409fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee        return mOrigConnection;
410b48819db07f9a0992a72173380c24249d7fc648abuzbee    }
411fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee
412a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    /**
413a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee     * Returns whether the original ImsPhoneConnection was a member
41431a4a6f5717f645da6b97ccc1e420ae1e1c71ce0buzbee     * of a conference call
41531a4a6f5717f645da6b97ccc1e420ae1e1c71ce0buzbee     * @return valid only when getOrigConnection() is not null
41631a4a6f5717f645da6b97ccc1e420ae1e1c71ce0buzbee     */
4172ce745c06271d5223d57dbf08117b20d5b60694aBrian Carlstrom    public abstract boolean isMultiparty();
4181fd3346740dfb7f47be9922312b68a4227fada96buzbee
4191fd3346740dfb7f47be9922312b68a4227fada96buzbee    public void migrateFrom(Connection c) {
42031a4a6f5717f645da6b97ccc1e420ae1e1c71ce0buzbee        if (c == null) return;
42131a4a6f5717f645da6b97ccc1e420ae1e1c71ce0buzbee        mListeners = c.mListeners;
4222da882315a61072664f7ce3c212307342e907207Andreas Gampe        mAddress = c.getAddress();
423df62950e7a32031b82360c407d46a37b94188fbbBrian Carlstrom        mNumberPresentation = c.getNumberPresentation();
424df62950e7a32031b82360c407d46a37b94188fbbBrian Carlstrom        mDialString = c.getOrigDialString();
425df62950e7a32031b82360c407d46a37b94188fbbBrian Carlstrom        mCnapName = c.getCnapName();
426df62950e7a32031b82360c407d46a37b94188fbbBrian Carlstrom        mCnapNamePresentation = c.getCnapNamePresentation();
427e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee        mIsIncoming = c.isIncoming();
428e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee        mCreateTime = c.getCreateTime();
4292da882315a61072664f7ce3c212307342e907207Andreas Gampe        mConnectTime = c.getConnectTime();
4302da882315a61072664f7ce3c212307342e907207Andreas Gampe        mConnectTimeReal = c.getConnectTimeReal();
4312da882315a61072664f7ce3c212307342e907207Andreas Gampe        mHoldingStartTime = c.getHoldingStartTime();
4322da882315a61072664f7ce3c212307342e907207Andreas Gampe        mOrigConnection = c.getOrigConnection();
4332da882315a61072664f7ce3c212307342e907207Andreas Gampe    }
4342da882315a61072664f7ce3c212307342e907207Andreas Gampe
4350d82948094d9a198e01aa95f64012bdedd5b6fc9buzbee    /**
4362da882315a61072664f7ce3c212307342e907207Andreas Gampe     * Assign a listener to be notified of state changes.
4370d82948094d9a198e01aa95f64012bdedd5b6fc9buzbee     *
4380d82948094d9a198e01aa95f64012bdedd5b6fc9buzbee     * @param listener A listener.
4390d82948094d9a198e01aa95f64012bdedd5b6fc9buzbee     */
440aad94383fc41e8f8770f0b2144f766a2ffa772e7buzbee    public final void addListener(Listener listener) {
441a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee        mListeners.add(listener);
442a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    }
443a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
444e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee    /**
445e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee     * Removes a listener.
446e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee     *
4472ce745c06271d5223d57dbf08117b20d5b60694aBrian Carlstrom     * @param listener A listener.
4481fd3346740dfb7f47be9922312b68a4227fada96buzbee     */
4491fd3346740dfb7f47be9922312b68a4227fada96buzbee    public final void removeListener(Listener listener) {
450fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee        mListeners.remove(listener);
4512da882315a61072664f7ce3c212307342e907207Andreas Gampe    }
452fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee
453a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    /**
454a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee     * Returns the current video state of the connection.
4551fd3346740dfb7f47be9922312b68a4227fada96buzbee     *
456fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee     * @return The video state of the connection.
45749161cef10a308aedada18e9aa742498d6e6c8c7Jeff Hao     */
45849161cef10a308aedada18e9aa742498d6e6c8c7Jeff Hao    public int getVideoState() {
45949161cef10a308aedada18e9aa742498d6e6c8c7Jeff Hao        return mVideoState;
4601fd3346740dfb7f47be9922312b68a4227fada96buzbee    }
4618b2c0b9abc3f520495f4387ea040132ba85cae69Ian Rogers
4628b2c0b9abc3f520495f4387ea040132ba85cae69Ian Rogers    /**
4638b2c0b9abc3f520495f4387ea040132ba85cae69Ian Rogers     * Returns the local video capability state for the connection.
46449161cef10a308aedada18e9aa742498d6e6c8c7Jeff Hao     *
46549161cef10a308aedada18e9aa742498d6e6c8c7Jeff Hao     * @return {@code True} if the connection has local video capabilities.
46649161cef10a308aedada18e9aa742498d6e6c8c7Jeff Hao     */
4678b2c0b9abc3f520495f4387ea040132ba85cae69Ian Rogers    public boolean isLocalVideoCapable() {
46849161cef10a308aedada18e9aa742498d6e6c8c7Jeff Hao        return mLocalVideoCapable;
4690d82948094d9a198e01aa95f64012bdedd5b6fc9buzbee    }
47049161cef10a308aedada18e9aa742498d6e6c8c7Jeff Hao
471fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee    /**
472137e88f798857321f4007631fdf052d2830ec2c4Ian Rogers     * Returns the remote video capability state for the connection.
4731fd3346740dfb7f47be9922312b68a4227fada96buzbee     *
474fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee     * @return {@code True} if the connection has remote video capabilities.
47549161cef10a308aedada18e9aa742498d6e6c8c7Jeff Hao     */
47649161cef10a308aedada18e9aa742498d6e6c8c7Jeff Hao    public boolean isRemoteVideoCapable() {
47749161cef10a308aedada18e9aa742498d6e6c8c7Jeff Hao        return mRemoteVideoCapable;
4781fd3346740dfb7f47be9922312b68a4227fada96buzbee    }
4798b2c0b9abc3f520495f4387ea040132ba85cae69Ian Rogers
4808b2c0b9abc3f520495f4387ea040132ba85cae69Ian Rogers    /**
4818b2c0b9abc3f520495f4387ea040132ba85cae69Ian Rogers     * Returns the {@link android.telecom.Connection.VideoProvider} for the connection.
48249161cef10a308aedada18e9aa742498d6e6c8c7Jeff Hao     *
48349161cef10a308aedada18e9aa742498d6e6c8c7Jeff Hao     * @return The {@link android.telecom.Connection.VideoProvider}.
48449161cef10a308aedada18e9aa742498d6e6c8c7Jeff Hao     */
4858b2c0b9abc3f520495f4387ea040132ba85cae69Ian Rogers    public android.telecom.Connection.VideoProvider getVideoProvider() {
48649161cef10a308aedada18e9aa742498d6e6c8c7Jeff Hao        return mVideoProvider;
4870d82948094d9a198e01aa95f64012bdedd5b6fc9buzbee    }
48849161cef10a308aedada18e9aa742498d6e6c8c7Jeff Hao
489fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee    /**
490a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee     * Returns the audio-quality for the connection.
491be1ca55db3362f5b100c4c65da5342fd299520bbHiroshi Yamauchi     *
492be1ca55db3362f5b100c4c65da5342fd299520bbHiroshi Yamauchi     * @return The audio quality for the connection.
493be1ca55db3362f5b100c4c65da5342fd299520bbHiroshi Yamauchi     */
49449161cef10a308aedada18e9aa742498d6e6c8c7Jeff Hao    public int getAudioQuality() {
495be1ca55db3362f5b100c4c65da5342fd299520bbHiroshi Yamauchi        return mAudioQuality;
496be1ca55db3362f5b100c4c65da5342fd299520bbHiroshi Yamauchi    }
497be1ca55db3362f5b100c4c65da5342fd299520bbHiroshi Yamauchi
49849161cef10a308aedada18e9aa742498d6e6c8c7Jeff Hao    /**
499be1ca55db3362f5b100c4c65da5342fd299520bbHiroshi Yamauchi     * Sets the videoState for the current connection and reports the changes to all listeners.
50049161cef10a308aedada18e9aa742498d6e6c8c7Jeff Hao     * Valid video states are defined in {@link android.telecom.VideoProfile}.
501be1ca55db3362f5b100c4c65da5342fd299520bbHiroshi Yamauchi     *
50249161cef10a308aedada18e9aa742498d6e6c8c7Jeff Hao     * @return The video state.
503be1ca55db3362f5b100c4c65da5342fd299520bbHiroshi Yamauchi     */
504be1ca55db3362f5b100c4c65da5342fd299520bbHiroshi Yamauchi    public void setVideoState(int videoState) {
505e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee        mVideoState = videoState;
506e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee        for (Listener l : mListeners) {
507e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee            l.onVideoStateChanged(mVideoState);
5082ce745c06271d5223d57dbf08117b20d5b60694aBrian Carlstrom        }
509862a76027076c341c26aa6cd4a30a7cdd6dc2143buzbee    }
510a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
511862a76027076c341c26aa6cd4a30a7cdd6dc2143buzbee    /**
512fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee     * Sets whether video capability is present locally.
5131fd3346740dfb7f47be9922312b68a4227fada96buzbee     *
514a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee     * @param capable {@code True} if video capable.
515a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee     */
516a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    public void setLocalVideoCapable(boolean capable) {
517a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee        mLocalVideoCapable = capable;
518a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee        for (Listener l : mListeners) {
519a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee            l.onLocalVideoCapabilityChanged(mLocalVideoCapable);
520fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee        }
5211fd3346740dfb7f47be9922312b68a4227fada96buzbee    }
522b046e16d8b8da318d6055f9308950131f1255e08buzbee
523b48819db07f9a0992a72173380c24249d7fc648abuzbee    /**
524fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee     * Sets whether video capability is present remotely.
525b046e16d8b8da318d6055f9308950131f1255e08buzbee     *
526b046e16d8b8da318d6055f9308950131f1255e08buzbee     * @param capable {@code True} if video capable.
5276a58cb16d803c9a7b3a75ccac8be19dd9d4e520dDmitry Petrochenko     */
528fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee    public void setRemoteVideoCapable(boolean capable) {
529b046e16d8b8da318d6055f9308950131f1255e08buzbee        mRemoteVideoCapable = capable;
530e45fb9e7976c8462b94a58ad60b006b0eacec49fMatteo Franchin        for (Listener l : mListeners) {
531b046e16d8b8da318d6055f9308950131f1255e08buzbee            l.onRemoteVideoCapabilityChanged(mRemoteVideoCapable);
532fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee        }
533b046e16d8b8da318d6055f9308950131f1255e08buzbee    }
5341fd3346740dfb7f47be9922312b68a4227fada96buzbee
535b046e16d8b8da318d6055f9308950131f1255e08buzbee    /**
5361fd3346740dfb7f47be9922312b68a4227fada96buzbee     * Set the audio quality for the connection.
537fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee     *
538a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee     * @param audioQuality The audio quality.
539fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee     */
5400d82948094d9a198e01aa95f64012bdedd5b6fc9buzbee    public void setAudioQuality(int audioQuality) {
541fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee        mAudioQuality = audioQuality;
542fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee        for (Listener l : mListeners) {
5431fd3346740dfb7f47be9922312b68a4227fada96buzbee            l.onAudioQualityChanged(mAudioQuality);
544a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee        }
545a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    }
546a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
547e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee    /**
5482da882315a61072664f7ce3c212307342e907207Andreas Gampe     * Sets the {@link android.telecom.Connection.VideoProvider} for the connection.
5492da882315a61072664f7ce3c212307342e907207Andreas Gampe     *
550fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee     * @param videoProvider The video call provider.
551a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee     */
552a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    public void setVideoProvider(android.telecom.Connection.VideoProvider videoProvider) {
553fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee        mVideoProvider = videoProvider;
554a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee        for (Listener l : mListeners) {
555fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee            l.onVideoProviderChanged(mVideoProvider);
556fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee        }
5571fd3346740dfb7f47be9922312b68a4227fada96buzbee    }
558a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
559a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    public void setConverted(String oriNumber) {
560e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee        mNumberConverted = true;
5612da882315a61072664f7ce3c212307342e907207Andreas Gampe        mConvertedNumber = mAddress;
562a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee        mAddress = oriNumber;
563e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee        mDialString = oriNumber;
564a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    }
565e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee
566e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee    /**
567e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee     * Notifies listeners of a change to conference participant(s).
5682ce745c06271d5223d57dbf08117b20d5b60694aBrian Carlstrom     *
569862a76027076c341c26aa6cd4a30a7cdd6dc2143buzbee     * @param conferenceParticipants The participant(s).
570a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee     */
571862a76027076c341c26aa6cd4a30a7cdd6dc2143buzbee    public void updateConferenceParticipants(List<ConferenceParticipant> conferenceParticipants) {
572fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee        for (Listener l : mListeners) {
5731fd3346740dfb7f47be9922312b68a4227fada96buzbee            l.onConferenceParticipantsChanged(conferenceParticipants);
574fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee        }
575df62950e7a32031b82360c407d46a37b94188fbbBrian Carlstrom    }
576df62950e7a32031b82360c407d46a37b94188fbbBrian Carlstrom
577e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee    /**
578a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee     * Notifies this Connection of a request to disconnect a participant of the conference managed
579e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee     * by the connection.
580e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee     *
5810d82948094d9a198e01aa95f64012bdedd5b6fc9buzbee     * @param endpoint the {@link Uri} of the participant to disconnect.
58202c8cc6d1312a2b55533f02f6369dc7c94672f90Brian Carlstrom     */
583a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    public void onDisconnectConferenceParticipant(Uri endpoint) {
584a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    }
585a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
586a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    /**
587e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee     * Build a human representation of a connection instance, suitable for debugging.
588e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee     * Don't log personal stuff unless in debug mode.
589ff093b31d75658c3404f9b51ee45760f346f06d9Ian Rogers     * @return a string representing the internal state of this connection.
590ff093b31d75658c3404f9b51ee45760f346f06d9Ian Rogers     */
5910d82948094d9a198e01aa95f64012bdedd5b6fc9buzbee    public String toString() {
592660188264dee3c8f3510e2e24c11816c6b60f197Andreas Gampe        StringBuilder str = new StringBuilder(128);
5930d82948094d9a198e01aa95f64012bdedd5b6fc9buzbee
5940d82948094d9a198e01aa95f64012bdedd5b6fc9buzbee        if (Rlog.isLoggable(LOG_TAG, Log.DEBUG)) {
5950d82948094d9a198e01aa95f64012bdedd5b6fc9buzbee            str.append("addr: " + getAddress())
5960d82948094d9a198e01aa95f64012bdedd5b6fc9buzbee                    .append(" pres.: " + getNumberPresentation())
5970d82948094d9a198e01aa95f64012bdedd5b6fc9buzbee                    .append(" dial: " + getOrigDialString())
5980d82948094d9a198e01aa95f64012bdedd5b6fc9buzbee                    .append(" postdial: " + getRemainingPostDialString())
5990d82948094d9a198e01aa95f64012bdedd5b6fc9buzbee                    .append(" cnap name: " + getCnapName())
6006459e7cb35ca83ffc2f266dddeb83673bc07ecd4buzbee                    .append("(" + getCnapNamePresentation() + ")");
6012ce745c06271d5223d57dbf08117b20d5b60694aBrian Carlstrom        }
60206606b9c4a1c00154ed15f719ad8ea994e54ee8eVladimir Marko        str.append(" incoming: " + isIncoming())
60306606b9c4a1c00154ed15f719ad8ea994e54ee8eVladimir Marko                .append(" state: " + getState())
60406606b9c4a1c00154ed15f719ad8ea994e54ee8eVladimir Marko                .append(" post dial state: " + getPostDialState());
60506606b9c4a1c00154ed15f719ad8ea994e54ee8eVladimir Marko        return str.toString();
60606606b9c4a1c00154ed15f719ad8ea994e54ee8eVladimir Marko    }
60706606b9c4a1c00154ed15f719ad8ea994e54ee8eVladimir Marko}
60806606b9c4a1c00154ed15f719ad8ea994e54ee8eVladimir Marko