Connection.java revision 17455a3d39350a39eb995897929977d793358365
1542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad/*
2542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad * Copyright (C) 2014 The Android Open Source Project
3542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad *
4542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad * Licensed under the Apache License, Version 2.0 (the "License");
5542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad * you may not use this file except in compliance with the License.
6542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad * You may obtain a copy of the License at
7542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad *
8542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad *      http://www.apache.org/licenses/LICENSE-2.0
9542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad *
10542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad * Unless required by applicable law or agreed to in writing, software
11542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad * distributed under the License is distributed on an "AS IS" BASIS,
12542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad * See the License for the specific language governing permissions and
14542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad * limitations under the License.
15542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad */
16542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad
17ef9f6f957d897ea0ed82114185b8fa3fefd4917bTyler Gunnpackage android.telecom;
18542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad
19ef9f6f957d897ea0ed82114185b8fa3fefd4917bTyler Gunnimport com.android.internal.telecom.IVideoCallback;
20ef9f6f957d897ea0ed82114185b8fa3fefd4917bTyler Gunnimport com.android.internal.telecom.IVideoProvider;
21b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
22542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awadimport android.net.Uri;
23b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awadimport android.os.Handler;
24b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awadimport android.os.IBinder;
25b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awadimport android.os.Message;
26b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awadimport android.os.RemoteException;
27b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awadimport android.view.Surface;
28542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad
29b693998fdfdd4498a33c4c69405f2708e4840aa7Santos Cordonimport java.util.ArrayList;
30b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awadimport java.util.Collections;
3175958420f2d294ceda517c2782b294002dc2969fTyler Gunnimport java.util.HashMap;
32b693998fdfdd4498a33c4c69405f2708e4840aa7Santos Cordonimport java.util.List;
33542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awadimport java.util.Set;
34229e3820dce98f64fd4834d5f421faec9a9d7026Jay Shraunerimport java.util.concurrent.ConcurrentHashMap;
35542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad
36542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad/**
37542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad * Represents a connection to a remote endpoint that carries voice traffic.
386107bab041fb7d851fbf865b7310d294aae970c8Ihab Awad * <p>
396107bab041fb7d851fbf865b7310d294aae970c8Ihab Awad * Implementations create a custom subclass of {@code Connection} and return it to the framework
406107bab041fb7d851fbf865b7310d294aae970c8Ihab Awad * as the return value of
416107bab041fb7d851fbf865b7310d294aae970c8Ihab Awad * {@link ConnectionService#onCreateIncomingConnection(PhoneAccountHandle, ConnectionRequest)}
426107bab041fb7d851fbf865b7310d294aae970c8Ihab Awad * or
436107bab041fb7d851fbf865b7310d294aae970c8Ihab Awad * {@link ConnectionService#onCreateOutgoingConnection(PhoneAccountHandle, ConnectionRequest)}.
446107bab041fb7d851fbf865b7310d294aae970c8Ihab Awad * Implementations are then responsible for updating the state of the {@code Connection}, and
456107bab041fb7d851fbf865b7310d294aae970c8Ihab Awad * must call {@link #destroy()} to signal to the framework that the {@code Connection} is no
466107bab041fb7d851fbf865b7310d294aae970c8Ihab Awad * longer used and associated resources may be recovered.
47542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad */
486d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunnpublic abstract class Connection implements IConferenceable {
49542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad
50b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad    public static final int STATE_INITIALIZING = 0;
51b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
52b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad    public static final int STATE_NEW = 1;
53b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
54b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad    public static final int STATE_RINGING = 2;
55b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
56b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad    public static final int STATE_DIALING = 3;
57b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
58b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad    public static final int STATE_ACTIVE = 4;
59b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
60b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad    public static final int STATE_HOLDING = 5;
61b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
62b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad    public static final int STATE_DISCONNECTED = 6;
63b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
645c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad    /** Connection can currently be put on hold or unheld. */
655c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad    public static final int CAPABILITY_HOLD = 0x00000001;
665c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad
675c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad    /** Connection supports the hold feature. */
685c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad    public static final int CAPABILITY_SUPPORT_HOLD = 0x00000002;
695c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad
705c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad    /**
715c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * Connections within a conference can be merged. A {@link ConnectionService} has the option to
725c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * add a {@link Conference} before the child {@link Connection}s are merged. This is how
735c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * CDMA-based {@link Connection}s are implemented. For these unmerged {@link Conference}s, this
745c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * capability allows a merge button to be shown while the conference is in the foreground
755c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * of the in-call UI.
765c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * <p>
775c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * This is only intended for use by a {@link Conference}.
785c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     */
795c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad    public static final int CAPABILITY_MERGE_CONFERENCE = 0x00000004;
805c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad
815c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad    /**
825c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * Connections within a conference can be swapped between foreground and background.
835c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * See {@link #CAPABILITY_MERGE_CONFERENCE} for additional information.
845c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * <p>
855c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * This is only intended for use by a {@link Conference}.
865c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     */
875c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad    public static final int CAPABILITY_SWAP_CONFERENCE = 0x00000008;
885c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad
895c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad    /**
905c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * @hide
915c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     */
925c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad    public static final int CAPABILITY_UNUSED = 0x00000010;
935c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad
945c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad    /** Connection supports responding via text option. */
955c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad    public static final int CAPABILITY_RESPOND_VIA_TEXT = 0x00000020;
965c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad
975c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad    /** Connection can be muted. */
985c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad    public static final int CAPABILITY_MUTE = 0x00000040;
995c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad
1005c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad    /**
1015c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * Connection supports conference management. This capability only applies to
1025c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * {@link Conference}s which can have {@link Connection}s as children.
1035c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     */
1045c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad    public static final int CAPABILITY_MANAGE_CONFERENCE = 0x00000080;
1055c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad
1065c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad    /**
1075e9e8bb30e4d26eba46684c03ca950b602dfb830Andrew Lee     * Local device supports receiving video.
1085c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * @hide
1095c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     */
1105e9e8bb30e4d26eba46684c03ca950b602dfb830Andrew Lee    public static final int CAPABILITY_SUPPORTS_VT_LOCAL_RX = 0x00000100;
1115c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad
1125c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad    /**
1135e9e8bb30e4d26eba46684c03ca950b602dfb830Andrew Lee     * Local device supports transmitting video.
1145c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * @hide
1155c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     */
1165e9e8bb30e4d26eba46684c03ca950b602dfb830Andrew Lee    public static final int CAPABILITY_SUPPORTS_VT_LOCAL_TX = 0x00000200;
1175c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad
1185c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad    /**
1195e9e8bb30e4d26eba46684c03ca950b602dfb830Andrew Lee     * Local device supports bidirectional video calling.
1205c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * @hide
1215c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     */
122e268f4c28ece283c8c9707b21c0ef7f940b907a8Andrew Lee    public static final int CAPABILITY_SUPPORTS_VT_LOCAL_BIDIRECTIONAL =
1235e9e8bb30e4d26eba46684c03ca950b602dfb830Andrew Lee            CAPABILITY_SUPPORTS_VT_LOCAL_RX | CAPABILITY_SUPPORTS_VT_LOCAL_TX;
1245c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad
1255c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad    /**
1265e9e8bb30e4d26eba46684c03ca950b602dfb830Andrew Lee     * Remote device supports receiving video.
1275c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * @hide
1285c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     */
1295e9e8bb30e4d26eba46684c03ca950b602dfb830Andrew Lee    public static final int CAPABILITY_SUPPORTS_VT_REMOTE_RX = 0x00000400;
1305e9e8bb30e4d26eba46684c03ca950b602dfb830Andrew Lee
1315e9e8bb30e4d26eba46684c03ca950b602dfb830Andrew Lee    /**
1325e9e8bb30e4d26eba46684c03ca950b602dfb830Andrew Lee     * Remote device supports transmitting video.
1335e9e8bb30e4d26eba46684c03ca950b602dfb830Andrew Lee     * @hide
1345e9e8bb30e4d26eba46684c03ca950b602dfb830Andrew Lee     */
1355e9e8bb30e4d26eba46684c03ca950b602dfb830Andrew Lee    public static final int CAPABILITY_SUPPORTS_VT_REMOTE_TX = 0x00000800;
1365e9e8bb30e4d26eba46684c03ca950b602dfb830Andrew Lee
1375e9e8bb30e4d26eba46684c03ca950b602dfb830Andrew Lee    /**
1385e9e8bb30e4d26eba46684c03ca950b602dfb830Andrew Lee     * Remote device supports bidirectional video calling.
1395e9e8bb30e4d26eba46684c03ca950b602dfb830Andrew Lee     * @hide
1405e9e8bb30e4d26eba46684c03ca950b602dfb830Andrew Lee     */
141e268f4c28ece283c8c9707b21c0ef7f940b907a8Andrew Lee    public static final int CAPABILITY_SUPPORTS_VT_REMOTE_BIDIRECTIONAL =
1425e9e8bb30e4d26eba46684c03ca950b602dfb830Andrew Lee            CAPABILITY_SUPPORTS_VT_REMOTE_RX | CAPABILITY_SUPPORTS_VT_REMOTE_TX;
1435c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad
1445c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad    /**
1455c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * Connection is able to be separated from its parent {@code Conference}, if any.
1465c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     */
1475c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad    public static final int CAPABILITY_SEPARATE_FROM_CONFERENCE = 0x00001000;
1485c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad
1495c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad    /**
1505c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * Connection is able to be individually disconnected when in a {@code Conference}.
1515c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     */
1525c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad    public static final int CAPABILITY_DISCONNECT_FROM_CONFERENCE = 0x00002000;
1535c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad
1545c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad    /**
1555c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * Whether the call is a generic conference, where we do not know the precise state of
1565c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * participants in the conference (eg. on CDMA).
1575c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     *
1585c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * @hide
1595c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     */
1605c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad    public static final int CAPABILITY_GENERIC_CONFERENCE = 0x00004000;
1615c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad
1625e9e8bb30e4d26eba46684c03ca950b602dfb830Andrew Lee    /**
1635e9e8bb30e4d26eba46684c03ca950b602dfb830Andrew Lee     * Connection is using high definition audio.
1645e9e8bb30e4d26eba46684c03ca950b602dfb830Andrew Lee     * @hide
1655e9e8bb30e4d26eba46684c03ca950b602dfb830Andrew Lee     */
1665e9e8bb30e4d26eba46684c03ca950b602dfb830Andrew Lee    public static final int CAPABILITY_HIGH_DEF_AUDIO = 0x00008000;
1675e9e8bb30e4d26eba46684c03ca950b602dfb830Andrew Lee
1685e9e8bb30e4d26eba46684c03ca950b602dfb830Andrew Lee    /**
1695e9e8bb30e4d26eba46684c03ca950b602dfb830Andrew Lee     * Connection is using WIFI.
1705e9e8bb30e4d26eba46684c03ca950b602dfb830Andrew Lee     * @hide
1715e9e8bb30e4d26eba46684c03ca950b602dfb830Andrew Lee     */
172d11a31561e88fbbb4f614caff8a05e7ff9ecd357Tyler Gunn    public static final int CAPABILITY_WIFI = 0x00010000;
1735e9e8bb30e4d26eba46684c03ca950b602dfb830Andrew Lee
174068085b35d4c7ef368fde6f01b42f87766d4a2b4Tyler Gunn    /**
175068085b35d4c7ef368fde6f01b42f87766d4a2b4Tyler Gunn     * Indicates that the current device callback number should be shown.
176068085b35d4c7ef368fde6f01b42f87766d4a2b4Tyler Gunn     *
177068085b35d4c7ef368fde6f01b42f87766d4a2b4Tyler Gunn     * @hide
178068085b35d4c7ef368fde6f01b42f87766d4a2b4Tyler Gunn     */
179d11a31561e88fbbb4f614caff8a05e7ff9ecd357Tyler Gunn    public static final int CAPABILITY_SHOW_CALLBACK_NUMBER = 0x00020000;
180068085b35d4c7ef368fde6f01b42f87766d4a2b4Tyler Gunn
181d11a31561e88fbbb4f614caff8a05e7ff9ecd357Tyler Gunn    /**
18289f41eb39e910e220957ac861651ead17eff9085Dong Zhou     * Speed up audio setup for MT call.
18389f41eb39e910e220957ac861651ead17eff9085Dong Zhou     * @hide
18489f41eb39e910e220957ac861651ead17eff9085Dong Zhou    */
185d11a31561e88fbbb4f614caff8a05e7ff9ecd357Tyler Gunn    public static final int CAPABILITY_SPEED_UP_MT_AUDIO = 0x00040000;
186068085b35d4c7ef368fde6f01b42f87766d4a2b4Tyler Gunn
18707366813cdf3768dcd69a1f744023747564d654aRekha Kumar    /**
188b5e0cfb24efded1e200989b5b48d49ac144c7704Tyler Gunn     * Call can be upgraded to a video call.
18907366813cdf3768dcd69a1f744023747564d654aRekha Kumar     * @hide
19007366813cdf3768dcd69a1f744023747564d654aRekha Kumar     */
19107366813cdf3768dcd69a1f744023747564d654aRekha Kumar    public static final int CAPABILITY_CAN_UPGRADE_TO_VIDEO = 0x00080000;
19207366813cdf3768dcd69a1f744023747564d654aRekha Kumar
193b5e0cfb24efded1e200989b5b48d49ac144c7704Tyler Gunn    /**
194b5e0cfb24efded1e200989b5b48d49ac144c7704Tyler Gunn     * For video calls, indicates whether the outgoing video for the call can be paused using
195b5e0cfb24efded1e200989b5b48d49ac144c7704Tyler Gunn     * the {@link android.telecom.VideoProfile.VideoState#PAUSED} VideoState.
196b5e0cfb24efded1e200989b5b48d49ac144c7704Tyler Gunn     * @hide
197b5e0cfb24efded1e200989b5b48d49ac144c7704Tyler Gunn     */
198b5e0cfb24efded1e200989b5b48d49ac144c7704Tyler Gunn    public static final int CAPABILITY_CAN_PAUSE_VIDEO = 0x00100000;
199b5e0cfb24efded1e200989b5b48d49ac144c7704Tyler Gunn
200d11a31561e88fbbb4f614caff8a05e7ff9ecd357Tyler Gunn    //**********************************************************************************************
201b5e0cfb24efded1e200989b5b48d49ac144c7704Tyler Gunn    // Next CAPABILITY value: 0x00200000
202d11a31561e88fbbb4f614caff8a05e7ff9ecd357Tyler Gunn    //**********************************************************************************************
203068085b35d4c7ef368fde6f01b42f87766d4a2b4Tyler Gunn
204b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad    // Flag controlling whether PII is emitted into the logs
205b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad    private static final boolean PII_DEBUG = Log.isLoggable(android.util.Log.DEBUG);
206b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
2075c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad    /**
2085c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * Whether the given capabilities support the specified capability.
2095c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     *
2105c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * @param capabilities A capability bit field.
2115c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * @param capability The capability to check capabilities for.
2125c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * @return Whether the specified capability is supported.
2135c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * @hide
2145c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     */
2155c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad    public static boolean can(int capabilities, int capability) {
2165c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        return (capabilities & capability) != 0;
2175c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad    }
2185c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad
2195c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad    /**
2205c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * Whether the capabilities of this {@code Connection} supports the specified capability.
2215c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     *
2225c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * @param capability The capability to check capabilities for.
2235c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * @return Whether the specified capability is supported.
2245c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * @hide
2255c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     */
2265c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad    public boolean can(int capability) {
2275c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        return can(mConnectionCapabilities, capability);
2285c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad    }
2295c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad
2305c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad    /**
2315c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * Removes the specified capability from the set of capabilities of this {@code Connection}.
2325c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     *
2335c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * @param capability The capability to remove from the set.
2345c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * @hide
2355c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     */
2365c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad    public void removeCapability(int capability) {
2375c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        mConnectionCapabilities &= ~capability;
2385c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad    }
2395c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad
2405c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad    /**
2415c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * Adds the specified capability to the set of capabilities of this {@code Connection}.
2425c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     *
2435c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * @param capability The capability to add to the set.
2445c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * @hide
2455c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     */
2465c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad    public void addCapability(int capability) {
2475c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        mConnectionCapabilities |= capability;
2485c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad    }
2495c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad
2505c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad
2515c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad    public static String capabilitiesToString(int capabilities) {
2525c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        StringBuilder builder = new StringBuilder();
2535c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        builder.append("[Capabilities:");
2545c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        if (can(capabilities, CAPABILITY_HOLD)) {
2555c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad            builder.append(" CAPABILITY_HOLD");
2565c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        }
2575c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        if (can(capabilities, CAPABILITY_SUPPORT_HOLD)) {
2585c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad            builder.append(" CAPABILITY_SUPPORT_HOLD");
2595c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        }
2605c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        if (can(capabilities, CAPABILITY_MERGE_CONFERENCE)) {
2615c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad            builder.append(" CAPABILITY_MERGE_CONFERENCE");
2625c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        }
2635c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        if (can(capabilities, CAPABILITY_SWAP_CONFERENCE)) {
2645c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad            builder.append(" CAPABILITY_SWAP_CONFERENCE");
2655c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        }
2665c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        if (can(capabilities, CAPABILITY_RESPOND_VIA_TEXT)) {
2675c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad            builder.append(" CAPABILITY_RESPOND_VIA_TEXT");
2685c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        }
2695c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        if (can(capabilities, CAPABILITY_MUTE)) {
2705c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad            builder.append(" CAPABILITY_MUTE");
2715c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        }
2725c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        if (can(capabilities, CAPABILITY_MANAGE_CONFERENCE)) {
2735c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad            builder.append(" CAPABILITY_MANAGE_CONFERENCE");
2745c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        }
2755e9e8bb30e4d26eba46684c03ca950b602dfb830Andrew Lee        if (can(capabilities, CAPABILITY_SUPPORTS_VT_LOCAL_RX)) {
2765e9e8bb30e4d26eba46684c03ca950b602dfb830Andrew Lee            builder.append(" CAPABILITY_SUPPORTS_VT_LOCAL_RX");
2775e9e8bb30e4d26eba46684c03ca950b602dfb830Andrew Lee        }
2785e9e8bb30e4d26eba46684c03ca950b602dfb830Andrew Lee        if (can(capabilities, CAPABILITY_SUPPORTS_VT_LOCAL_TX)) {
2795e9e8bb30e4d26eba46684c03ca950b602dfb830Andrew Lee            builder.append(" CAPABILITY_SUPPORTS_VT_LOCAL_TX");
2805e9e8bb30e4d26eba46684c03ca950b602dfb830Andrew Lee        }
281e268f4c28ece283c8c9707b21c0ef7f940b907a8Andrew Lee        if (can(capabilities, CAPABILITY_SUPPORTS_VT_LOCAL_BIDIRECTIONAL)) {
282e268f4c28ece283c8c9707b21c0ef7f940b907a8Andrew Lee            builder.append(" CAPABILITY_SUPPORTS_VT_LOCAL_BIDIRECTIONAL");
2835c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        }
2845e9e8bb30e4d26eba46684c03ca950b602dfb830Andrew Lee        if (can(capabilities, CAPABILITY_SUPPORTS_VT_REMOTE_RX)) {
2855e9e8bb30e4d26eba46684c03ca950b602dfb830Andrew Lee            builder.append(" CAPABILITY_SUPPORTS_VT_REMOTE_RX");
2865e9e8bb30e4d26eba46684c03ca950b602dfb830Andrew Lee        }
2875e9e8bb30e4d26eba46684c03ca950b602dfb830Andrew Lee        if (can(capabilities, CAPABILITY_SUPPORTS_VT_REMOTE_TX)) {
2885e9e8bb30e4d26eba46684c03ca950b602dfb830Andrew Lee            builder.append(" CAPABILITY_SUPPORTS_VT_REMOTE_TX");
2895e9e8bb30e4d26eba46684c03ca950b602dfb830Andrew Lee        }
290e268f4c28ece283c8c9707b21c0ef7f940b907a8Andrew Lee        if (can(capabilities, CAPABILITY_SUPPORTS_VT_REMOTE_BIDIRECTIONAL)) {
291e268f4c28ece283c8c9707b21c0ef7f940b907a8Andrew Lee            builder.append(" CAPABILITY_SUPPORTS_VT_REMOTE_BIDIRECTIONAL");
2925c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        }
29380fff3c0a5f68d4b426a35468daeaf4ff4d3d375Andrew Lee        if (can(capabilities, CAPABILITY_HIGH_DEF_AUDIO)) {
29480fff3c0a5f68d4b426a35468daeaf4ff4d3d375Andrew Lee            builder.append(" CAPABILITY_HIGH_DEF_AUDIO");
2955c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        }
2961a8ae3e7306b5094f36252e3315fddeaf8b952bcAndrew Lee        if (can(capabilities, CAPABILITY_WIFI)) {
2971a8ae3e7306b5094f36252e3315fddeaf8b952bcAndrew Lee            builder.append(" CAPABILITY_WIFI");
2985c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        }
2995c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        if (can(capabilities, CAPABILITY_GENERIC_CONFERENCE)) {
3005c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad            builder.append(" CAPABILITY_GENERIC_CONFERENCE");
3015c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        }
302068085b35d4c7ef368fde6f01b42f87766d4a2b4Tyler Gunn        if (can(capabilities, CAPABILITY_SHOW_CALLBACK_NUMBER)) {
303068085b35d4c7ef368fde6f01b42f87766d4a2b4Tyler Gunn            builder.append(" CAPABILITY_SHOW_CALLBACK_NUMBER");
304068085b35d4c7ef368fde6f01b42f87766d4a2b4Tyler Gunn        }
30589f41eb39e910e220957ac861651ead17eff9085Dong Zhou        if (can(capabilities, CAPABILITY_SPEED_UP_MT_AUDIO)) {
306d11a31561e88fbbb4f614caff8a05e7ff9ecd357Tyler Gunn            builder.append(" CAPABILITY_SPEED_UP_MT_AUDIO");
30789f41eb39e910e220957ac861651ead17eff9085Dong Zhou        }
30807366813cdf3768dcd69a1f744023747564d654aRekha Kumar        if (can(capabilities, CAPABILITY_CAN_UPGRADE_TO_VIDEO)) {
30907366813cdf3768dcd69a1f744023747564d654aRekha Kumar            builder.append(" CAPABILITY_CAN_UPGRADE_TO_VIDEO");
31007366813cdf3768dcd69a1f744023747564d654aRekha Kumar        }
311b5e0cfb24efded1e200989b5b48d49ac144c7704Tyler Gunn        if (can(capabilities, CAPABILITY_CAN_PAUSE_VIDEO)) {
312b5e0cfb24efded1e200989b5b48d49ac144c7704Tyler Gunn            builder.append(" CAPABILITY_CAN_PAUSE_VIDEO");
313b5e0cfb24efded1e200989b5b48d49ac144c7704Tyler Gunn        }
3145c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        builder.append("]");
3155c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        return builder.toString();
3165c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad    }
3175c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad
318091768c3021d740b7d66846d36405c4d4c76cc56Sailesh Nepal    /** @hide */
319612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepal    public abstract static class Listener {
320542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad        public void onStateChanged(Connection c, int state) {}
321100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee        public void onAddressChanged(Connection c, Uri newAddress, int presentation) {}
322612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepal        public void onCallerDisplayNameChanged(
323612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepal                Connection c, String callerDisplayName, int presentation) {}
324aa07df84f279a87ad6370758c9d792a660f2cebbTyler Gunn        public void onVideoStateChanged(Connection c, int videoState) {}
3257f3d41fd124dd7c4a8b72c1d48df08a8ee7209ecAndrew Lee        public void onDisconnected(Connection c, DisconnectCause disconnectCause) {}
326091768c3021d740b7d66846d36405c4d4c76cc56Sailesh Nepal        public void onPostDialWait(Connection c, String remaining) {}
32727d1c2d148fe377ca0d2744f0f85789a42c8f808Nancy Chen        public void onPostDialChar(Connection c, char nextChar) {}
328100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee        public void onRingbackRequested(Connection c, boolean ringback) {}
329612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepal        public void onDestroyed(Connection c) {}
3305c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        public void onConnectionCapabilitiesChanged(Connection c, int capabilities) {}
331b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        public void onVideoProviderChanged(
332b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                Connection c, VideoProvider videoProvider) {}
333001bbbb239d4ef1005a87039c7c53e26d8f13ad6Sailesh Nepal        public void onAudioModeIsVoipChanged(Connection c, boolean isVoip) {}
334001bbbb239d4ef1005a87039c7c53e26d8f13ad6Sailesh Nepal        public void onStatusHintsChanged(Connection c, StatusHints statusHints) {}
3356d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn        public void onConferenceablesChanged(
3366d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn                Connection c, List<IConferenceable> conferenceables) {}
337823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon        public void onConferenceChanged(Connection c, Conference conference) {}
3383bffcf78b5e4bd8b60543126fc0bdb09808f28f5Tyler Gunn        /** @hide */
339ab4650c4563cd46e65ac37f924fee8febfd759c6Tyler Gunn        public void onConferenceParticipantsChanged(Connection c,
340ab4650c4563cd46e65ac37f924fee8febfd759c6Tyler Gunn                List<ConferenceParticipant> participants) {}
3418a2b1199a6db0c6f2493e96e25ec1d89e3f62769Tyler Gunn        public void onConferenceStarted() {}
34217455a3d39350a39eb995897929977d793358365Anthony Lee        public void onConferenceMergeFailed(Connection c) {}
343542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad    }
344542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad
345b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad    public static abstract class VideoProvider {
346b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
347b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        /**
348b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * Video is not being received (no protocol pause was issued).
349b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         */
350b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        public static final int SESSION_EVENT_RX_PAUSE = 1;
351b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
352b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        /**
353b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * Video reception has resumed after a SESSION_EVENT_RX_PAUSE.
354b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         */
355b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        public static final int SESSION_EVENT_RX_RESUME = 2;
356b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
357b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        /**
358b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * Video transmission has begun. This occurs after a negotiated start of video transmission
359b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * when the underlying protocol has actually begun transmitting video to the remote party.
360b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         */
361b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        public static final int SESSION_EVENT_TX_START = 3;
362b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
363b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        /**
364b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * Video transmission has stopped. This occurs after a negotiated stop of video transmission
365b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * when the underlying protocol has actually stopped transmitting video to the remote party.
366b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         */
367b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        public static final int SESSION_EVENT_TX_STOP = 4;
368b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
369b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        /**
370b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * A camera failure has occurred for the selected camera.  The In-Call UI can use this as a
371b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * cue to inform the user the camera is not available.
372b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         */
373b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        public static final int SESSION_EVENT_CAMERA_FAILURE = 5;
374b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
375b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        /**
376b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * Issued after {@code SESSION_EVENT_CAMERA_FAILURE} when the camera is once again ready for
377b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * operation.  The In-Call UI can use this as a cue to inform the user that the camera has
378b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * become available again.
379b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         */
380b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        public static final int SESSION_EVENT_CAMERA_READY = 6;
381b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
382b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        /**
383b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * Session modify request was successful.
384b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         */
385b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        public static final int SESSION_MODIFY_REQUEST_SUCCESS = 1;
386b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
387b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        /**
388b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * Session modify request failed.
389b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         */
390b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        public static final int SESSION_MODIFY_REQUEST_FAIL = 2;
391b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
392b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        /**
393b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * Session modify request ignored due to invalid parameters.
394b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         */
395b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        public static final int SESSION_MODIFY_REQUEST_INVALID = 3;
396b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
39707366813cdf3768dcd69a1f744023747564d654aRekha Kumar        /**
39807366813cdf3768dcd69a1f744023747564d654aRekha Kumar         * Session modify request timed out.
39907366813cdf3768dcd69a1f744023747564d654aRekha Kumar         */
40007366813cdf3768dcd69a1f744023747564d654aRekha Kumar        public static final int SESSION_MODIFY_REQUEST_TIMED_OUT = 4;
40107366813cdf3768dcd69a1f744023747564d654aRekha Kumar
40207366813cdf3768dcd69a1f744023747564d654aRekha Kumar        /**
40307366813cdf3768dcd69a1f744023747564d654aRekha Kumar         * Session modify request rejected by remote UE.
40407366813cdf3768dcd69a1f744023747564d654aRekha Kumar         */
40507366813cdf3768dcd69a1f744023747564d654aRekha Kumar        public static final int SESSION_MODIFY_REQUEST_REJECTED_BY_REMOTE = 5;
40607366813cdf3768dcd69a1f744023747564d654aRekha Kumar
40775958420f2d294ceda517c2782b294002dc2969fTyler Gunn        private static final int MSG_ADD_VIDEO_CALLBACK = 1;
408b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        private static final int MSG_SET_CAMERA = 2;
409b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        private static final int MSG_SET_PREVIEW_SURFACE = 3;
410b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        private static final int MSG_SET_DISPLAY_SURFACE = 4;
411b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        private static final int MSG_SET_DEVICE_ORIENTATION = 5;
412b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        private static final int MSG_SET_ZOOM = 6;
413b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        private static final int MSG_SEND_SESSION_MODIFY_REQUEST = 7;
414b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        private static final int MSG_SEND_SESSION_MODIFY_RESPONSE = 8;
415b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        private static final int MSG_REQUEST_CAMERA_CAPABILITIES = 9;
4165c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        private static final int MSG_REQUEST_CONNECTION_DATA_USAGE = 10;
417b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        private static final int MSG_SET_PAUSE_IMAGE = 11;
41875958420f2d294ceda517c2782b294002dc2969fTyler Gunn        private static final int MSG_REMOVE_VIDEO_CALLBACK = 12;
419b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
420b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        private final VideoProvider.VideoProviderHandler
421b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                mMessageHandler = new VideoProvider.VideoProviderHandler();
422b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        private final VideoProvider.VideoProviderBinder mBinder;
42375958420f2d294ceda517c2782b294002dc2969fTyler Gunn
42475958420f2d294ceda517c2782b294002dc2969fTyler Gunn        /**
42575958420f2d294ceda517c2782b294002dc2969fTyler Gunn         * Stores a list of the video callbacks, keyed by IBinder.
42675958420f2d294ceda517c2782b294002dc2969fTyler Gunn         */
42775958420f2d294ceda517c2782b294002dc2969fTyler Gunn        private HashMap<IBinder, IVideoCallback> mVideoCallbacks = new HashMap<>();
428b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
429b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        /**
430b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * Default handler used to consolidate binder method calls onto a single thread.
431b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         */
432b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        private final class VideoProviderHandler extends Handler {
433b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            @Override
434b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            public void handleMessage(Message msg) {
435b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                switch (msg.what) {
43675958420f2d294ceda517c2782b294002dc2969fTyler Gunn                    case MSG_ADD_VIDEO_CALLBACK: {
43775958420f2d294ceda517c2782b294002dc2969fTyler Gunn                        IBinder binder = (IBinder) msg.obj;
43875958420f2d294ceda517c2782b294002dc2969fTyler Gunn                        IVideoCallback callback = IVideoCallback.Stub
43975958420f2d294ceda517c2782b294002dc2969fTyler Gunn                                .asInterface((IBinder) msg.obj);
44075958420f2d294ceda517c2782b294002dc2969fTyler Gunn                        if (mVideoCallbacks.containsKey(binder)) {
44175958420f2d294ceda517c2782b294002dc2969fTyler Gunn                            Log.i(this, "addVideoProvider - skipped; already present.");
44275958420f2d294ceda517c2782b294002dc2969fTyler Gunn                            break;
44375958420f2d294ceda517c2782b294002dc2969fTyler Gunn                        }
44475958420f2d294ceda517c2782b294002dc2969fTyler Gunn                        mVideoCallbacks.put(binder, callback);
44575958420f2d294ceda517c2782b294002dc2969fTyler Gunn                        Log.i(this, "addVideoProvider  "+ mVideoCallbacks.size());
44675958420f2d294ceda517c2782b294002dc2969fTyler Gunn                        break;
44775958420f2d294ceda517c2782b294002dc2969fTyler Gunn                    }
44875958420f2d294ceda517c2782b294002dc2969fTyler Gunn                    case MSG_REMOVE_VIDEO_CALLBACK: {
44975958420f2d294ceda517c2782b294002dc2969fTyler Gunn                        IBinder binder = (IBinder) msg.obj;
45075958420f2d294ceda517c2782b294002dc2969fTyler Gunn                        IVideoCallback callback = IVideoCallback.Stub
45175958420f2d294ceda517c2782b294002dc2969fTyler Gunn                                .asInterface((IBinder) msg.obj);
45275958420f2d294ceda517c2782b294002dc2969fTyler Gunn                        if (!mVideoCallbacks.containsKey(binder)) {
45375958420f2d294ceda517c2782b294002dc2969fTyler Gunn                            Log.i(this, "removeVideoProvider - skipped; not present.");
45475958420f2d294ceda517c2782b294002dc2969fTyler Gunn                            break;
45575958420f2d294ceda517c2782b294002dc2969fTyler Gunn                        }
45675958420f2d294ceda517c2782b294002dc2969fTyler Gunn                        mVideoCallbacks.remove(binder);
457b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                        break;
45875958420f2d294ceda517c2782b294002dc2969fTyler Gunn                    }
459b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                    case MSG_SET_CAMERA:
460b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                        onSetCamera((String) msg.obj);
461b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                        break;
462b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                    case MSG_SET_PREVIEW_SURFACE:
463b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                        onSetPreviewSurface((Surface) msg.obj);
464b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                        break;
465b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                    case MSG_SET_DISPLAY_SURFACE:
466b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                        onSetDisplaySurface((Surface) msg.obj);
467b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                        break;
468b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                    case MSG_SET_DEVICE_ORIENTATION:
469b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                        onSetDeviceOrientation(msg.arg1);
470b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                        break;
471b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                    case MSG_SET_ZOOM:
472b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                        onSetZoom((Float) msg.obj);
473b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                        break;
474b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                    case MSG_SEND_SESSION_MODIFY_REQUEST:
475b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                        onSendSessionModifyRequest((VideoProfile) msg.obj);
476b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                        break;
477b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                    case MSG_SEND_SESSION_MODIFY_RESPONSE:
478b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                        onSendSessionModifyResponse((VideoProfile) msg.obj);
479b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                        break;
480b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                    case MSG_REQUEST_CAMERA_CAPABILITIES:
481b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                        onRequestCameraCapabilities();
482b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                        break;
4835c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad                    case MSG_REQUEST_CONNECTION_DATA_USAGE:
4845c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad                        onRequestConnectionDataUsage();
485b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                        break;
486b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                    case MSG_SET_PAUSE_IMAGE:
487b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                        onSetPauseImage((String) msg.obj);
488b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                        break;
489b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                    default:
490b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                        break;
491b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                }
492b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            }
493b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        }
494b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
495b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        /**
496b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * IVideoProvider stub implementation.
497b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         */
498b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        private final class VideoProviderBinder extends IVideoProvider.Stub {
49975958420f2d294ceda517c2782b294002dc2969fTyler Gunn            public void addVideoCallback(IBinder videoCallbackBinder) {
50075958420f2d294ceda517c2782b294002dc2969fTyler Gunn                mMessageHandler.obtainMessage(
50175958420f2d294ceda517c2782b294002dc2969fTyler Gunn                        MSG_ADD_VIDEO_CALLBACK, videoCallbackBinder).sendToTarget();
50275958420f2d294ceda517c2782b294002dc2969fTyler Gunn            }
50375958420f2d294ceda517c2782b294002dc2969fTyler Gunn
50475958420f2d294ceda517c2782b294002dc2969fTyler Gunn            public void removeVideoCallback(IBinder videoCallbackBinder) {
505b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                mMessageHandler.obtainMessage(
50675958420f2d294ceda517c2782b294002dc2969fTyler Gunn                        MSG_REMOVE_VIDEO_CALLBACK, videoCallbackBinder).sendToTarget();
507b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            }
508b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
509b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            public void setCamera(String cameraId) {
510b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                mMessageHandler.obtainMessage(MSG_SET_CAMERA, cameraId).sendToTarget();
511b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            }
512b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
513b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            public void setPreviewSurface(Surface surface) {
514b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                mMessageHandler.obtainMessage(MSG_SET_PREVIEW_SURFACE, surface).sendToTarget();
515b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            }
516b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
517b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            public void setDisplaySurface(Surface surface) {
518b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                mMessageHandler.obtainMessage(MSG_SET_DISPLAY_SURFACE, surface).sendToTarget();
519b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            }
520b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
521b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            public void setDeviceOrientation(int rotation) {
52207366813cdf3768dcd69a1f744023747564d654aRekha Kumar                mMessageHandler.obtainMessage(
52307366813cdf3768dcd69a1f744023747564d654aRekha Kumar                        MSG_SET_DEVICE_ORIENTATION, rotation, 0).sendToTarget();
524b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            }
525b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
526b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            public void setZoom(float value) {
527b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                mMessageHandler.obtainMessage(MSG_SET_ZOOM, value).sendToTarget();
528b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            }
529b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
530b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            public void sendSessionModifyRequest(VideoProfile requestProfile) {
531b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                mMessageHandler.obtainMessage(
532b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                        MSG_SEND_SESSION_MODIFY_REQUEST, requestProfile).sendToTarget();
533b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            }
534b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
535b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            public void sendSessionModifyResponse(VideoProfile responseProfile) {
536b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                mMessageHandler.obtainMessage(
537b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                        MSG_SEND_SESSION_MODIFY_RESPONSE, responseProfile).sendToTarget();
538b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            }
539b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
540b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            public void requestCameraCapabilities() {
541b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                mMessageHandler.obtainMessage(MSG_REQUEST_CAMERA_CAPABILITIES).sendToTarget();
542b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            }
543b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
544b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            public void requestCallDataUsage() {
5455c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad                mMessageHandler.obtainMessage(MSG_REQUEST_CONNECTION_DATA_USAGE).sendToTarget();
546b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            }
547b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
548b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            public void setPauseImage(String uri) {
549b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                mMessageHandler.obtainMessage(MSG_SET_PAUSE_IMAGE, uri).sendToTarget();
550b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            }
551b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        }
552b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
553b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        public VideoProvider() {
554b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            mBinder = new VideoProvider.VideoProviderBinder();
555b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        }
556b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
557b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        /**
558b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * Returns binder object which can be used across IPC methods.
559b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * @hide
560b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         */
561b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        public final IVideoProvider getInterface() {
562b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            return mBinder;
563b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        }
564b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
565b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        /**
5665c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad         * Sets the camera to be used for video recording in a video connection.
567b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         *
568b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * @param cameraId The id of the camera.
569b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         */
570b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        public abstract void onSetCamera(String cameraId);
571b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
572b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        /**
573b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * Sets the surface to be used for displaying a preview of what the user's camera is
574b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * currently capturing.  When video transmission is enabled, this is the video signal which
575b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * is sent to the remote device.
576b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         *
577b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * @param surface The surface.
578b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         */
579b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        public abstract void onSetPreviewSurface(Surface surface);
580b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
581b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        /**
582b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * Sets the surface to be used for displaying the video received from the remote device.
583b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         *
584b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * @param surface The surface.
585b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         */
586b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        public abstract void onSetDisplaySurface(Surface surface);
587b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
588b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        /**
589b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * Sets the device orientation, in degrees.  Assumes that a standard portrait orientation of
590b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * the device is 0 degrees.
591b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         *
592b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * @param rotation The device orientation, in degrees.
593b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         */
594b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        public abstract void onSetDeviceOrientation(int rotation);
595b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
596b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        /**
597b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * Sets camera zoom ratio.
598b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         *
599b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * @param value The camera zoom ratio.
600b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         */
601b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        public abstract void onSetZoom(float value);
602b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
603b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        /**
604b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * Issues a request to modify the properties of the current session.  The request is
605b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * sent to the remote device where it it handled by the In-Call UI.
6065c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad         * Some examples of session modification requests: upgrade connection from audio to video,
6075c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad         * downgrade connection from video to audio, pause video.
608b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         *
6095c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad         * @param requestProfile The requested connection video properties.
610b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         */
611b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        public abstract void onSendSessionModifyRequest(VideoProfile requestProfile);
612b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
613b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        /**te
6145c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad         * Provides a response to a request to change the current connection session video
615b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * properties.
616b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * This is in response to a request the InCall UI has received via the InCall UI.
617b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         *
6185c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad         * @param responseProfile The response connection video properties.
619b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         */
620b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        public abstract void onSendSessionModifyResponse(VideoProfile responseProfile);
621b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
622b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        /**
623b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * Issues a request to the video provider to retrieve the camera capabilities.
624b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * Camera capabilities are reported back to the caller via the In-Call UI.
625b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         */
626b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        public abstract void onRequestCameraCapabilities();
627b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
628b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        /**
629b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * Issues a request to the video telephony framework to retrieve the cumulative data usage
6305c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad         * for the current connection.  Data usage is reported back to the caller via the
631b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * InCall UI.
632b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         */
6335c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        public abstract void onRequestConnectionDataUsage();
634b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
635b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        /**
636b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * Provides the video telephony framework with the URI of an image to be displayed to remote
637b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * devices when the video signal is paused.
638b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         *
639b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * @param uri URI of image to display.
640b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         */
641b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        public abstract void onSetPauseImage(String uri);
642b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
643b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        /**
64475958420f2d294ceda517c2782b294002dc2969fTyler Gunn         * Invokes callback method defined in listening {@link InCallService} implementations.
645b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         *
6465c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad         * @param videoProfile The requested video connection profile.
647b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         */
648b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        public void receiveSessionModifyRequest(VideoProfile videoProfile) {
64975958420f2d294ceda517c2782b294002dc2969fTyler Gunn            if (mVideoCallbacks != null) {
650b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                try {
65175958420f2d294ceda517c2782b294002dc2969fTyler Gunn                    for (IVideoCallback callback : mVideoCallbacks.values()) {
65275958420f2d294ceda517c2782b294002dc2969fTyler Gunn                        callback.receiveSessionModifyRequest(videoProfile);
65375958420f2d294ceda517c2782b294002dc2969fTyler Gunn                    }
654b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                } catch (RemoteException ignored) {
655b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                }
656b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            }
657b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        }
658b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
659b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        /**
66075958420f2d294ceda517c2782b294002dc2969fTyler Gunn         * Invokes callback method defined in listening {@link InCallService} implementations.
661b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         *
662b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * @param status Status of the session modify request.  Valid values are
663b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         *               {@link VideoProvider#SESSION_MODIFY_REQUEST_SUCCESS},
664b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         *               {@link VideoProvider#SESSION_MODIFY_REQUEST_FAIL},
665b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         *               {@link VideoProvider#SESSION_MODIFY_REQUEST_INVALID}
666b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * @param requestedProfile The original request which was sent to the remote device.
667b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * @param responseProfile The actual profile changes made by the remote device.
668b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         */
669b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        public void receiveSessionModifyResponse(int status,
670b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                VideoProfile requestedProfile, VideoProfile responseProfile) {
67175958420f2d294ceda517c2782b294002dc2969fTyler Gunn            if (mVideoCallbacks != null) {
672b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                try {
67375958420f2d294ceda517c2782b294002dc2969fTyler Gunn                    for (IVideoCallback callback : mVideoCallbacks.values()) {
67475958420f2d294ceda517c2782b294002dc2969fTyler Gunn                        callback.receiveSessionModifyResponse(status, requestedProfile,
67575958420f2d294ceda517c2782b294002dc2969fTyler Gunn                                responseProfile);
67675958420f2d294ceda517c2782b294002dc2969fTyler Gunn                    }
677b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                } catch (RemoteException ignored) {
678b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                }
679b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            }
680b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        }
681542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad
682b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        /**
68375958420f2d294ceda517c2782b294002dc2969fTyler Gunn         * Invokes callback method defined in listening {@link InCallService} implementations.
684b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         *
685b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * Valid values are: {@link VideoProvider#SESSION_EVENT_RX_PAUSE},
686b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * {@link VideoProvider#SESSION_EVENT_RX_RESUME},
687b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * {@link VideoProvider#SESSION_EVENT_TX_START},
688b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * {@link VideoProvider#SESSION_EVENT_TX_STOP}
689b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         *
690b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * @param event The event.
691b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         */
692b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        public void handleCallSessionEvent(int event) {
69375958420f2d294ceda517c2782b294002dc2969fTyler Gunn            if (mVideoCallbacks != null) {
694b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                try {
69575958420f2d294ceda517c2782b294002dc2969fTyler Gunn                    for (IVideoCallback callback : mVideoCallbacks.values()) {
69675958420f2d294ceda517c2782b294002dc2969fTyler Gunn                        callback.handleCallSessionEvent(event);
69775958420f2d294ceda517c2782b294002dc2969fTyler Gunn                    }
698b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                } catch (RemoteException ignored) {
699b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                }
700b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            }
701b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        }
702b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
703b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        /**
70475958420f2d294ceda517c2782b294002dc2969fTyler Gunn         * Invokes callback method defined in listening {@link InCallService} implementations.
705b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         *
706b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * @param width  The updated peer video width.
707b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * @param height The updated peer video height.
708b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         */
709b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        public void changePeerDimensions(int width, int height) {
71075958420f2d294ceda517c2782b294002dc2969fTyler Gunn            if (mVideoCallbacks != null) {
711b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                try {
71275958420f2d294ceda517c2782b294002dc2969fTyler Gunn                    for (IVideoCallback callback : mVideoCallbacks.values()) {
71375958420f2d294ceda517c2782b294002dc2969fTyler Gunn                        callback.changePeerDimensions(width, height);
71475958420f2d294ceda517c2782b294002dc2969fTyler Gunn                    }
715b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                } catch (RemoteException ignored) {
716b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                }
717b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            }
718b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        }
719bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton
720b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        /**
72175958420f2d294ceda517c2782b294002dc2969fTyler Gunn         * Invokes callback method defined in listening {@link InCallService} implementations.
722b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         *
723b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * @param dataUsage The updated data usage.
724b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         */
72507366813cdf3768dcd69a1f744023747564d654aRekha Kumar        public void changeCallDataUsage(long dataUsage) {
72675958420f2d294ceda517c2782b294002dc2969fTyler Gunn            if (mVideoCallbacks != null) {
727b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                try {
72875958420f2d294ceda517c2782b294002dc2969fTyler Gunn                    for (IVideoCallback callback : mVideoCallbacks.values()) {
72975958420f2d294ceda517c2782b294002dc2969fTyler Gunn                        callback.changeCallDataUsage(dataUsage);
73075958420f2d294ceda517c2782b294002dc2969fTyler Gunn                    }
731b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                } catch (RemoteException ignored) {
732b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                }
733b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            }
734b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        }
735b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
736b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        /**
73775958420f2d294ceda517c2782b294002dc2969fTyler Gunn         * Invokes callback method defined in listening {@link InCallService} implementations.
738b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         *
739b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * @param cameraCapabilities The changed camera capabilities.
740b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         */
741b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        public void changeCameraCapabilities(CameraCapabilities cameraCapabilities) {
74275958420f2d294ceda517c2782b294002dc2969fTyler Gunn            if (mVideoCallbacks != null) {
743b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                try {
74475958420f2d294ceda517c2782b294002dc2969fTyler Gunn                    for (IVideoCallback callback : mVideoCallbacks.values()) {
74575958420f2d294ceda517c2782b294002dc2969fTyler Gunn                        callback.changeCameraCapabilities(cameraCapabilities);
74675958420f2d294ceda517c2782b294002dc2969fTyler Gunn                    }
747b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                } catch (RemoteException ignored) {
748b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                }
749b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            }
750b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        }
75107366813cdf3768dcd69a1f744023747564d654aRekha Kumar
75207366813cdf3768dcd69a1f744023747564d654aRekha Kumar        /**
75375958420f2d294ceda517c2782b294002dc2969fTyler Gunn         * Invokes callback method defined in listening {@link InCallService} implementations.
75407366813cdf3768dcd69a1f744023747564d654aRekha Kumar         *
75507366813cdf3768dcd69a1f744023747564d654aRekha Kumar         * @param videoQuality The updated video quality.
75607366813cdf3768dcd69a1f744023747564d654aRekha Kumar         */
75707366813cdf3768dcd69a1f744023747564d654aRekha Kumar        public void changeVideoQuality(int videoQuality) {
75875958420f2d294ceda517c2782b294002dc2969fTyler Gunn            if (mVideoCallbacks != null) {
75907366813cdf3768dcd69a1f744023747564d654aRekha Kumar                try {
76075958420f2d294ceda517c2782b294002dc2969fTyler Gunn                    for (IVideoCallback callback : mVideoCallbacks.values()) {
76175958420f2d294ceda517c2782b294002dc2969fTyler Gunn                        callback.changeVideoQuality(videoQuality);
76275958420f2d294ceda517c2782b294002dc2969fTyler Gunn                    }
76307366813cdf3768dcd69a1f744023747564d654aRekha Kumar                } catch (RemoteException ignored) {
76407366813cdf3768dcd69a1f744023747564d654aRekha Kumar                }
76507366813cdf3768dcd69a1f744023747564d654aRekha Kumar            }
76607366813cdf3768dcd69a1f744023747564d654aRekha Kumar        }
767542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad    }
768542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad
7697c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon    private final Listener mConnectionDeathListener = new Listener() {
7707c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon        @Override
7717c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon        public void onDestroyed(Connection c) {
7726d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn            if (mConferenceables.remove(c)) {
7736d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn                fireOnConferenceableConnectionsChanged();
7746d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn            }
7756d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn        }
7766d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn    };
7776d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn
7786d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn    private final Conference.Listener mConferenceDeathListener = new Conference.Listener() {
7796d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn        @Override
7806d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn        public void onDestroyed(Conference c) {
7816d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn            if (mConferenceables.remove(c)) {
7827c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon                fireOnConferenceableConnectionsChanged();
7837c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon            }
7847c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon        }
7857c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon    };
7867c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon
787229e3820dce98f64fd4834d5f421faec9a9d7026Jay Shrauner    /**
788229e3820dce98f64fd4834d5f421faec9a9d7026Jay Shrauner     * ConcurrentHashMap constructor params: 8 is initial table size, 0.9f is
789229e3820dce98f64fd4834d5f421faec9a9d7026Jay Shrauner     * load factor before resizing, 1 means we only expect a single thread to
790229e3820dce98f64fd4834d5f421faec9a9d7026Jay Shrauner     * access the map so make only a single shard
791229e3820dce98f64fd4834d5f421faec9a9d7026Jay Shrauner     */
792229e3820dce98f64fd4834d5f421faec9a9d7026Jay Shrauner    private final Set<Listener> mListeners = Collections.newSetFromMap(
793229e3820dce98f64fd4834d5f421faec9a9d7026Jay Shrauner            new ConcurrentHashMap<Listener, Boolean>(8, 0.9f, 1));
7946d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn    private final List<IConferenceable> mConferenceables = new ArrayList<>();
7956d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn    private final List<IConferenceable> mUnmodifiableConferenceables =
7966d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn            Collections.unmodifiableList(mConferenceables);
797b693998fdfdd4498a33c4c69405f2708e4840aa7Santos Cordon
798b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad    private int mState = STATE_NEW;
799b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad    private AudioState mAudioState;
800100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee    private Uri mAddress;
801100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee    private int mAddressPresentation;
802612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepal    private String mCallerDisplayName;
803612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepal    private int mCallerDisplayNamePresentation;
804100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee    private boolean mRingbackRequested = false;
8055c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad    private int mConnectionCapabilities;
806b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad    private VideoProvider mVideoProvider;
80733aaae4a07fdcce223fe74d96d751f4bffa6723aSailesh Nepal    private boolean mAudioModeIsVoip;
808e7ef59a77d55c9802cc7d919f7dd794bd5fea30eSailesh Nepal    private StatusHints mStatusHints;
809aa07df84f279a87ad6370758c9d792a660f2cebbTyler Gunn    private int mVideoState;
8107f3d41fd124dd7c4a8b72c1d48df08a8ee7209ecAndrew Lee    private DisconnectCause mDisconnectCause;
811823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon    private Conference mConference;
812823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon    private ConnectionService mConnectionService;
813542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad
814542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad    /**
815542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     * Create a new Connection.
816542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     */
817f29511043e1c3bf750e28427410192c793363bf7Santos Cordon    public Connection() {}
818542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad
819542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad    /**
820100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee     * @return The address (e.g., phone number) to which this Connection is currently communicating.
821542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     */
822100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee    public final Uri getAddress() {
823100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee        return mAddress;
824542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad    }
825542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad
826542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad    /**
827100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee     * @return The presentation requirements for the address.
828ef9f6f957d897ea0ed82114185b8fa3fefd4917bTyler Gunn     *         See {@link TelecomManager} for valid values.
829542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     */
830100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee    public final int getAddressPresentation() {
831100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee        return mAddressPresentation;
832612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepal    }
833612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepal
834612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepal    /**
835612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepal     * @return The caller display name (CNAP).
836612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepal     */
837612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepal    public final String getCallerDisplayName() {
838612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepal        return mCallerDisplayName;
839612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepal    }
840612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepal
841612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepal    /**
8429d568c01db1f90fbe9cbff1d9385e7e7b809e066Nancy Chen     * @return The presentation requirements for the handle.
843ef9f6f957d897ea0ed82114185b8fa3fefd4917bTyler Gunn     *         See {@link TelecomManager} for valid values.
844612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepal     */
845612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepal    public final int getCallerDisplayNamePresentation() {
846612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepal        return mCallerDisplayNamePresentation;
847542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad    }
848542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad
849542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad    /**
850612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepal     * @return The state of this Connection.
8518d83fa9bbd2ad15299a4419241eb10404e7839beTyler Gunn     */
852612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepal    public final int getState() {
853612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepal        return mState;
8542a46b90222e5c9c73de012382a604a71f9c0c30cSailesh Nepal    }
8558d83fa9bbd2ad15299a4419241eb10404e7839beTyler Gunn
8568d83fa9bbd2ad15299a4419241eb10404e7839beTyler Gunn    /**
8575c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * Returns the video state of the connection.
858b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad     * Valid values: {@link VideoProfile.VideoState#AUDIO_ONLY},
859b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad     * {@link VideoProfile.VideoState#BIDIRECTIONAL},
860b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad     * {@link VideoProfile.VideoState#TX_ENABLED},
861b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad     * {@link VideoProfile.VideoState#RX_ENABLED}.
862aa07df84f279a87ad6370758c9d792a660f2cebbTyler Gunn     *
8635c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * @return The video state of the connection.
86427d1e257f3cba2d5954e5562db69035df9ecf290Tyler Gunn     * @hide
865aa07df84f279a87ad6370758c9d792a660f2cebbTyler Gunn     */
866aa07df84f279a87ad6370758c9d792a660f2cebbTyler Gunn    public final int getVideoState() {
867aa07df84f279a87ad6370758c9d792a660f2cebbTyler Gunn        return mVideoState;
868aa07df84f279a87ad6370758c9d792a660f2cebbTyler Gunn    }
869aa07df84f279a87ad6370758c9d792a660f2cebbTyler Gunn
870aa07df84f279a87ad6370758c9d792a660f2cebbTyler Gunn    /**
8715c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * @return The audio state of the connection, describing how its audio is currently
872542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     *         being routed by the system. This is {@code null} if this Connection
873542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     *         does not directly know about its audio state.
874542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     */
875b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad    public final AudioState getAudioState() {
876b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        return mAudioState;
877542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad    }
878542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad
879542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad    /**
880823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon     * @return The conference that this connection is a part of.  Null if it is not part of any
881823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon     *         conference.
8822a46b90222e5c9c73de012382a604a71f9c0c30cSailesh Nepal     */
883823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon    public final Conference getConference() {
884823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon        return mConference;
8852a46b90222e5c9c73de012382a604a71f9c0c30cSailesh Nepal    }
8862a46b90222e5c9c73de012382a604a71f9c0c30cSailesh Nepal
8872a46b90222e5c9c73de012382a604a71f9c0c30cSailesh Nepal    /**
888823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon     * Returns whether this connection is requesting that the system play a ringback tone
889823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon     * on its behalf.
8902a46b90222e5c9c73de012382a604a71f9c0c30cSailesh Nepal     */
891100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee    public final boolean isRingbackRequested() {
892100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee        return mRingbackRequested;
8932a46b90222e5c9c73de012382a604a71f9c0c30cSailesh Nepal    }
8942a46b90222e5c9c73de012382a604a71f9c0c30cSailesh Nepal
8952a46b90222e5c9c73de012382a604a71f9c0c30cSailesh Nepal    /**
89633aaae4a07fdcce223fe74d96d751f4bffa6723aSailesh Nepal     * @return True if the connection's audio mode is VOIP.
89733aaae4a07fdcce223fe74d96d751f4bffa6723aSailesh Nepal     */
89833aaae4a07fdcce223fe74d96d751f4bffa6723aSailesh Nepal    public final boolean getAudioModeIsVoip() {
89933aaae4a07fdcce223fe74d96d751f4bffa6723aSailesh Nepal        return mAudioModeIsVoip;
90033aaae4a07fdcce223fe74d96d751f4bffa6723aSailesh Nepal    }
90133aaae4a07fdcce223fe74d96d751f4bffa6723aSailesh Nepal
90233aaae4a07fdcce223fe74d96d751f4bffa6723aSailesh Nepal    /**
903e7ef59a77d55c9802cc7d919f7dd794bd5fea30eSailesh Nepal     * @return The status hints for this connection.
904e7ef59a77d55c9802cc7d919f7dd794bd5fea30eSailesh Nepal     */
905e7ef59a77d55c9802cc7d919f7dd794bd5fea30eSailesh Nepal    public final StatusHints getStatusHints() {
906e7ef59a77d55c9802cc7d919f7dd794bd5fea30eSailesh Nepal        return mStatusHints;
907e7ef59a77d55c9802cc7d919f7dd794bd5fea30eSailesh Nepal    }
908e7ef59a77d55c9802cc7d919f7dd794bd5fea30eSailesh Nepal
909e7ef59a77d55c9802cc7d919f7dd794bd5fea30eSailesh Nepal    /**
910542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     * Assign a listener to be notified of state changes.
911542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     *
912542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     * @param l A listener.
913542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     * @return This Connection.
914542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     *
915542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     * @hide
916542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     */
917542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad    public final Connection addConnectionListener(Listener l) {
918d34e5713c9571859d12e9c2e83ce3946cacdd68eSantos Cordon        mListeners.add(l);
919542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad        return this;
920542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad    }
921542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad
922542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad    /**
923542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     * Remove a previously assigned listener that was being notified of state changes.
924542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     *
925542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     * @param l A Listener.
926542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     * @return This Connection.
927542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     *
928542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     * @hide
929542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     */
930542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad    public final Connection removeConnectionListener(Listener l) {
931229e3820dce98f64fd4834d5f421faec9a9d7026Jay Shrauner        if (l != null) {
932229e3820dce98f64fd4834d5f421faec9a9d7026Jay Shrauner            mListeners.remove(l);
933229e3820dce98f64fd4834d5f421faec9a9d7026Jay Shrauner        }
934542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad        return this;
935542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad    }
936542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad
937542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad    /**
938cf7020b7e84c1f5190db7167d70cb0675cd3332fSailesh Nepal     * @return The {@link DisconnectCause} for this connection.
939bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton     */
9407f3d41fd124dd7c4a8b72c1d48df08a8ee7209ecAndrew Lee    public final DisconnectCause getDisconnectCause() {
941cf7020b7e84c1f5190db7167d70cb0675cd3332fSailesh Nepal        return mDisconnectCause;
942bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton    }
943bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton
944bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton    /**
945542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     * Inform this Connection that the state of its audio output has been changed externally.
946542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     *
947542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     * @param state The new audio state.
948400cc48512dc69e940ad4d233a3b47ee9574601dSailesh Nepal     * @hide
949542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     */
950b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad    final void setAudioState(AudioState state) {
9515c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        checkImmutable();
95260ac30bb8a30fa7283d592c12ddf2da9447adf14Ihab Awad        Log.d(this, "setAudioState %s", state);
953b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        mAudioState = state;
954354b2bd0fe8647bd5c7e28f3598b9b7414846124Nancy Chen        onAudioStateChanged(state);
955542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad    }
956542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad
957542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad    /**
958b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad     * @param state An integer value of a {@code STATE_*} constant.
959542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     * @return A string representation of the value.
960542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     */
961542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad    public static String stateToString(int state) {
962542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad        switch (state) {
963b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            case STATE_INITIALIZING:
964b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                return "STATE_INITIALIZING";
965b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            case STATE_NEW:
966b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                return "STATE_NEW";
967b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            case STATE_RINGING:
968b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                return "STATE_RINGING";
969b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            case STATE_DIALING:
970b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                return "STATE_DIALING";
971b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            case STATE_ACTIVE:
972b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                return "STATE_ACTIVE";
973b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            case STATE_HOLDING:
974b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                return "STATE_HOLDING";
975b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            case STATE_DISCONNECTED:
976542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad                return "DISCONNECTED";
977542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad            default:
97860ac30bb8a30fa7283d592c12ddf2da9447adf14Ihab Awad                Log.wtf(Connection.class, "Unknown state %d", state);
979542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad                return "UNKNOWN";
980542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad        }
981542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad    }
982542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad
983542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad    /**
9845c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * Returns the connection's capabilities, as a bit mask of the {@code CAPABILITY_*} constants.
98552a28f619fca8c2118e1f421cb56f6542805e954Ihab Awad     */
9865c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad    public final int getConnectionCapabilities() {
9875c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        return mConnectionCapabilities;
98852a28f619fca8c2118e1f421cb56f6542805e954Ihab Awad    }
98952a28f619fca8c2118e1f421cb56f6542805e954Ihab Awad
99052a28f619fca8c2118e1f421cb56f6542805e954Ihab Awad    /**
991100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee     * Sets the value of the {@link #getAddress()} property.
992542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     *
993100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee     * @param address The new address.
994100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee     * @param presentation The presentation requirements for the address.
995ef9f6f957d897ea0ed82114185b8fa3fefd4917bTyler Gunn     *        See {@link TelecomManager} for valid values.
996542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     */
997100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee    public final void setAddress(Uri address, int presentation) {
9985c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        checkImmutable();
999100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee        Log.d(this, "setAddress %s", address);
1000100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee        mAddress = address;
1001100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee        mAddressPresentation = presentation;
1002d34e5713c9571859d12e9c2e83ce3946cacdd68eSantos Cordon        for (Listener l : mListeners) {
1003100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee            l.onAddressChanged(this, address, presentation);
1004d34e5713c9571859d12e9c2e83ce3946cacdd68eSantos Cordon        }
1005542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad    }
1006542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad
1007542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad    /**
1008612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepal     * Sets the caller display name (CNAP).
10092a46b90222e5c9c73de012382a604a71f9c0c30cSailesh Nepal     *
1010612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepal     * @param callerDisplayName The new display name.
10119d568c01db1f90fbe9cbff1d9385e7e7b809e066Nancy Chen     * @param presentation The presentation requirements for the handle.
1012ef9f6f957d897ea0ed82114185b8fa3fefd4917bTyler Gunn     *        See {@link TelecomManager} for valid values.
1013612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepal     */
1014612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepal    public final void setCallerDisplayName(String callerDisplayName, int presentation) {
10155c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        checkImmutable();
1016612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepal        Log.d(this, "setCallerDisplayName %s", callerDisplayName);
1017d34e5713c9571859d12e9c2e83ce3946cacdd68eSantos Cordon        mCallerDisplayName = callerDisplayName;
1018d34e5713c9571859d12e9c2e83ce3946cacdd68eSantos Cordon        mCallerDisplayNamePresentation = presentation;
1019d34e5713c9571859d12e9c2e83ce3946cacdd68eSantos Cordon        for (Listener l : mListeners) {
1020d34e5713c9571859d12e9c2e83ce3946cacdd68eSantos Cordon            l.onCallerDisplayNameChanged(this, callerDisplayName, presentation);
1021d34e5713c9571859d12e9c2e83ce3946cacdd68eSantos Cordon        }
10222a46b90222e5c9c73de012382a604a71f9c0c30cSailesh Nepal    }
10232a46b90222e5c9c73de012382a604a71f9c0c30cSailesh Nepal
10242a46b90222e5c9c73de012382a604a71f9c0c30cSailesh Nepal    /**
1025aa07df84f279a87ad6370758c9d792a660f2cebbTyler Gunn     * Set the video state for the connection.
1026b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad     * Valid values: {@link VideoProfile.VideoState#AUDIO_ONLY},
1027b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad     * {@link VideoProfile.VideoState#BIDIRECTIONAL},
1028b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad     * {@link VideoProfile.VideoState#TX_ENABLED},
1029b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad     * {@link VideoProfile.VideoState#RX_ENABLED}.
1030aa07df84f279a87ad6370758c9d792a660f2cebbTyler Gunn     *
1031aa07df84f279a87ad6370758c9d792a660f2cebbTyler Gunn     * @param videoState The new video state.
103227d1e257f3cba2d5954e5562db69035df9ecf290Tyler Gunn     * @hide
1033aa07df84f279a87ad6370758c9d792a660f2cebbTyler Gunn     */
1034aa07df84f279a87ad6370758c9d792a660f2cebbTyler Gunn    public final void setVideoState(int videoState) {
10355c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        checkImmutable();
1036aa07df84f279a87ad6370758c9d792a660f2cebbTyler Gunn        Log.d(this, "setVideoState %d", videoState);
1037d34e5713c9571859d12e9c2e83ce3946cacdd68eSantos Cordon        mVideoState = videoState;
1038d34e5713c9571859d12e9c2e83ce3946cacdd68eSantos Cordon        for (Listener l : mListeners) {
1039d34e5713c9571859d12e9c2e83ce3946cacdd68eSantos Cordon            l.onVideoStateChanged(this, mVideoState);
1040d34e5713c9571859d12e9c2e83ce3946cacdd68eSantos Cordon        }
1041aa07df84f279a87ad6370758c9d792a660f2cebbTyler Gunn    }
1042aa07df84f279a87ad6370758c9d792a660f2cebbTyler Gunn
1043aa07df84f279a87ad6370758c9d792a660f2cebbTyler Gunn    /**
10445c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * Sets state to active (e.g., an ongoing connection where two or more parties can actively
1045542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     * communicate).
1046542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     */
1047400cc48512dc69e940ad4d233a3b47ee9574601dSailesh Nepal    public final void setActive() {
10485c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        checkImmutable();
1049100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee        setRingbackRequested(false);
1050b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        setState(STATE_ACTIVE);
1051542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad    }
1052542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad
1053542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad    /**
10545c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * Sets state to ringing (e.g., an inbound ringing connection).
1055542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     */
1056400cc48512dc69e940ad4d233a3b47ee9574601dSailesh Nepal    public final void setRinging() {
10575c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        checkImmutable();
1058b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        setState(STATE_RINGING);
1059542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad    }
1060542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad
1061542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad    /**
1062bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton     * Sets state to initializing (this Connection is not yet ready to be used).
1063bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton     */
1064bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton    public final void setInitializing() {
10655c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        checkImmutable();
1066b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        setState(STATE_INITIALIZING);
1067bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton    }
1068bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton
1069bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton    /**
1070bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton     * Sets state to initialized (the Connection has been set up and is now ready to be used).
1071bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton     */
1072bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton    public final void setInitialized() {
10735c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        checkImmutable();
1074b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        setState(STATE_NEW);
1075bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton    }
1076bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton
1077bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton    /**
10785c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * Sets state to dialing (e.g., dialing an outbound connection).
1079542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     */
1080400cc48512dc69e940ad4d233a3b47ee9574601dSailesh Nepal    public final void setDialing() {
10815c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        checkImmutable();
1082b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        setState(STATE_DIALING);
1083542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad    }
1084542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad
1085542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad    /**
1086542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     * Sets state to be on hold.
1087542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     */
1088400cc48512dc69e940ad4d233a3b47ee9574601dSailesh Nepal    public final void setOnHold() {
10895c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        checkImmutable();
1090b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        setState(STATE_HOLDING);
1091542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad    }
1092542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad
1093542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad    /**
10945c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * Sets the video connection provider.
1095b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad     * @param videoProvider The video provider.
109627d1e257f3cba2d5954e5562db69035df9ecf290Tyler Gunn     * @hide
10975ffbe8b850c2703b64617f0140d051a5412dd861Andrew Lee     */
1098b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad    public final void setVideoProvider(VideoProvider videoProvider) {
10995c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        checkImmutable();
1100b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        mVideoProvider = videoProvider;
1101d34e5713c9571859d12e9c2e83ce3946cacdd68eSantos Cordon        for (Listener l : mListeners) {
1102b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            l.onVideoProviderChanged(this, videoProvider);
1103d34e5713c9571859d12e9c2e83ce3946cacdd68eSantos Cordon        }
11045ffbe8b850c2703b64617f0140d051a5412dd861Andrew Lee    }
11055ffbe8b850c2703b64617f0140d051a5412dd861Andrew Lee
1106b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad    public final VideoProvider getVideoProvider() {
1107b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        return mVideoProvider;
1108a27a1938ab27aeb17144867b231f830622fa6ad4Andrew Lee    }
1109a27a1938ab27aeb17144867b231f830622fa6ad4Andrew Lee
11105ffbe8b850c2703b64617f0140d051a5412dd861Andrew Lee    /**
1111091768c3021d740b7d66846d36405c4d4c76cc56Sailesh Nepal     * Sets state to disconnected.
1112542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     *
11137f3d41fd124dd7c4a8b72c1d48df08a8ee7209ecAndrew Lee     * @param disconnectCause The reason for the disconnection, as specified by
1114b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad     *         {@link DisconnectCause}.
1115542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     */
11167f3d41fd124dd7c4a8b72c1d48df08a8ee7209ecAndrew Lee    public final void setDisconnected(DisconnectCause disconnectCause) {
11175c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        checkImmutable();
11187f3d41fd124dd7c4a8b72c1d48df08a8ee7209ecAndrew Lee        mDisconnectCause = disconnectCause;
1119b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        setState(STATE_DISCONNECTED);
1120f34519b4dd12d065c510b06922a196e8a3fd9885mike dooley        Log.d(this, "Disconnected with cause %s", disconnectCause);
1121d34e5713c9571859d12e9c2e83ce3946cacdd68eSantos Cordon        for (Listener l : mListeners) {
11227f3d41fd124dd7c4a8b72c1d48df08a8ee7209ecAndrew Lee            l.onDisconnected(this, disconnectCause);
1123d34e5713c9571859d12e9c2e83ce3946cacdd68eSantos Cordon        }
1124542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad    }
1125542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad
1126542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad    /**
11275c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * Informs listeners that this {@code Connection} is in a post-dial wait state. This is done
11285c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * when (a) the {@code Connection} is issuing a DTMF sequence; (b) it has encountered a "wait"
11295c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * character; and (c) it wishes to inform the In-Call app that it is waiting for the end-user
11305c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * to send an {@link #onPostDialContinue(boolean)} signal.
11315c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     *
11325c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * @param remaining The DTMF character sequence remaining to be emitted once the
11335c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     *         {@link #onPostDialContinue(boolean)} is received, including any "wait" characters
11345c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     *         that remaining sequence may contain.
1135091768c3021d740b7d66846d36405c4d4c76cc56Sailesh Nepal     */
1136091768c3021d740b7d66846d36405c4d4c76cc56Sailesh Nepal    public final void setPostDialWait(String remaining) {
11375c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        checkImmutable();
1138d34e5713c9571859d12e9c2e83ce3946cacdd68eSantos Cordon        for (Listener l : mListeners) {
1139d34e5713c9571859d12e9c2e83ce3946cacdd68eSantos Cordon            l.onPostDialWait(this, remaining);
1140d34e5713c9571859d12e9c2e83ce3946cacdd68eSantos Cordon        }
1141091768c3021d740b7d66846d36405c4d4c76cc56Sailesh Nepal    }
1142091768c3021d740b7d66846d36405c4d4c76cc56Sailesh Nepal
1143091768c3021d740b7d66846d36405c4d4c76cc56Sailesh Nepal    /**
114427d1c2d148fe377ca0d2744f0f85789a42c8f808Nancy Chen     * Informs listeners that this {@code Connection} has processed a character in the post-dial
114527d1c2d148fe377ca0d2744f0f85789a42c8f808Nancy Chen     * started state. This is done when (a) the {@code Connection} is issuing a DTMF sequence;
114627d1c2d148fe377ca0d2744f0f85789a42c8f808Nancy Chen     * (b) it has encountered a "wait" character; and (c) it wishes to signal Telecom to play
114727d1c2d148fe377ca0d2744f0f85789a42c8f808Nancy Chen     * the corresponding DTMF tone locally.
114827d1c2d148fe377ca0d2744f0f85789a42c8f808Nancy Chen     *
114927d1c2d148fe377ca0d2744f0f85789a42c8f808Nancy Chen     * @param nextChar The DTMF character that was just processed by the {@code Connection}.
115027d1c2d148fe377ca0d2744f0f85789a42c8f808Nancy Chen     *
115127d1c2d148fe377ca0d2744f0f85789a42c8f808Nancy Chen     * @hide
115227d1c2d148fe377ca0d2744f0f85789a42c8f808Nancy Chen     */
115327d1c2d148fe377ca0d2744f0f85789a42c8f808Nancy Chen    public final void setNextPostDialWaitChar(char nextChar) {
115427d1c2d148fe377ca0d2744f0f85789a42c8f808Nancy Chen        checkImmutable();
115527d1c2d148fe377ca0d2744f0f85789a42c8f808Nancy Chen        for (Listener l : mListeners) {
115627d1c2d148fe377ca0d2744f0f85789a42c8f808Nancy Chen            l.onPostDialChar(this, nextChar);
115727d1c2d148fe377ca0d2744f0f85789a42c8f808Nancy Chen        }
115827d1c2d148fe377ca0d2744f0f85789a42c8f808Nancy Chen    }
115927d1c2d148fe377ca0d2744f0f85789a42c8f808Nancy Chen
116027d1c2d148fe377ca0d2744f0f85789a42c8f808Nancy Chen    /**
1161f835897f9f799490de27653ae39141ba6bc14223Ihab Awad     * Requests that the framework play a ringback tone. This is to be invoked by implementations
11625c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * that do not play a ringback tone themselves in the connection's audio stream.
1163f835897f9f799490de27653ae39141ba6bc14223Ihab Awad     *
1164f835897f9f799490de27653ae39141ba6bc14223Ihab Awad     * @param ringback Whether the ringback tone is to be played.
1165f835897f9f799490de27653ae39141ba6bc14223Ihab Awad     */
1166100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee    public final void setRingbackRequested(boolean ringback) {
11675c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        checkImmutable();
1168100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee        if (mRingbackRequested != ringback) {
1169100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee            mRingbackRequested = ringback;
1170d34e5713c9571859d12e9c2e83ce3946cacdd68eSantos Cordon            for (Listener l : mListeners) {
1171100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee                l.onRingbackRequested(this, ringback);
1172d34e5713c9571859d12e9c2e83ce3946cacdd68eSantos Cordon            }
1173d34e5713c9571859d12e9c2e83ce3946cacdd68eSantos Cordon        }
1174f835897f9f799490de27653ae39141ba6bc14223Ihab Awad    }
1175f835897f9f799490de27653ae39141ba6bc14223Ihab Awad
1176f835897f9f799490de27653ae39141ba6bc14223Ihab Awad    /**
11775c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * Sets the connection's capabilities as a bit mask of the {@code CAPABILITY_*} constants.
11781a7061ba950538c93d92c0448752a212039cc06aSailesh Nepal     *
11795c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * @param connectionCapabilities The new connection capabilities.
1180b693998fdfdd4498a33c4c69405f2708e4840aa7Santos Cordon     */
11815c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad    public final void setConnectionCapabilities(int connectionCapabilities) {
11825c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        checkImmutable();
11835c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        if (mConnectionCapabilities != connectionCapabilities) {
11845c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad            mConnectionCapabilities = connectionCapabilities;
1185d34e5713c9571859d12e9c2e83ce3946cacdd68eSantos Cordon            for (Listener l : mListeners) {
11865c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad                l.onConnectionCapabilitiesChanged(this, mConnectionCapabilities);
1187d34e5713c9571859d12e9c2e83ce3946cacdd68eSantos Cordon            }
1188d34e5713c9571859d12e9c2e83ce3946cacdd68eSantos Cordon        }
1189b693998fdfdd4498a33c4c69405f2708e4840aa7Santos Cordon    }
1190b693998fdfdd4498a33c4c69405f2708e4840aa7Santos Cordon
1191b693998fdfdd4498a33c4c69405f2708e4840aa7Santos Cordon    /**
11927c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon     * Tears down the Connection object.
1193b693998fdfdd4498a33c4c69405f2708e4840aa7Santos Cordon     */
119436a713431ceda2e5462c5dc5d1300f32acf9e63aEvan Charlton    public final void destroy() {
1195229e3820dce98f64fd4834d5f421faec9a9d7026Jay Shrauner        for (Listener l : mListeners) {
1196229e3820dce98f64fd4834d5f421faec9a9d7026Jay Shrauner            l.onDestroyed(this);
1197d34e5713c9571859d12e9c2e83ce3946cacdd68eSantos Cordon        }
1198b693998fdfdd4498a33c4c69405f2708e4840aa7Santos Cordon    }
1199b693998fdfdd4498a33c4c69405f2708e4840aa7Santos Cordon
1200b693998fdfdd4498a33c4c69405f2708e4840aa7Santos Cordon    /**
120133aaae4a07fdcce223fe74d96d751f4bffa6723aSailesh Nepal     * Requests that the framework use VOIP audio mode for this connection.
120233aaae4a07fdcce223fe74d96d751f4bffa6723aSailesh Nepal     *
120333aaae4a07fdcce223fe74d96d751f4bffa6723aSailesh Nepal     * @param isVoip True if the audio mode is VOIP.
120433aaae4a07fdcce223fe74d96d751f4bffa6723aSailesh Nepal     */
120533aaae4a07fdcce223fe74d96d751f4bffa6723aSailesh Nepal    public final void setAudioModeIsVoip(boolean isVoip) {
12065c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        checkImmutable();
1207d34e5713c9571859d12e9c2e83ce3946cacdd68eSantos Cordon        mAudioModeIsVoip = isVoip;
1208d34e5713c9571859d12e9c2e83ce3946cacdd68eSantos Cordon        for (Listener l : mListeners) {
1209d34e5713c9571859d12e9c2e83ce3946cacdd68eSantos Cordon            l.onAudioModeIsVoipChanged(this, isVoip);
1210d34e5713c9571859d12e9c2e83ce3946cacdd68eSantos Cordon        }
121133aaae4a07fdcce223fe74d96d751f4bffa6723aSailesh Nepal    }
121233aaae4a07fdcce223fe74d96d751f4bffa6723aSailesh Nepal
121333aaae4a07fdcce223fe74d96d751f4bffa6723aSailesh Nepal    /**
1214e7ef59a77d55c9802cc7d919f7dd794bd5fea30eSailesh Nepal     * Sets the label and icon status to display in the in-call UI.
1215e7ef59a77d55c9802cc7d919f7dd794bd5fea30eSailesh Nepal     *
1216e7ef59a77d55c9802cc7d919f7dd794bd5fea30eSailesh Nepal     * @param statusHints The status label and icon to set.
1217e7ef59a77d55c9802cc7d919f7dd794bd5fea30eSailesh Nepal     */
1218e7ef59a77d55c9802cc7d919f7dd794bd5fea30eSailesh Nepal    public final void setStatusHints(StatusHints statusHints) {
12195c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        checkImmutable();
1220d34e5713c9571859d12e9c2e83ce3946cacdd68eSantos Cordon        mStatusHints = statusHints;
1221d34e5713c9571859d12e9c2e83ce3946cacdd68eSantos Cordon        for (Listener l : mListeners) {
1222d34e5713c9571859d12e9c2e83ce3946cacdd68eSantos Cordon            l.onStatusHintsChanged(this, statusHints);
1223d34e5713c9571859d12e9c2e83ce3946cacdd68eSantos Cordon        }
1224e7ef59a77d55c9802cc7d919f7dd794bd5fea30eSailesh Nepal    }
1225e7ef59a77d55c9802cc7d919f7dd794bd5fea30eSailesh Nepal
1226e7ef59a77d55c9802cc7d919f7dd794bd5fea30eSailesh Nepal    /**
12277c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon     * Sets the connections with which this connection can be conferenced.
12287c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon     *
12297c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon     * @param conferenceableConnections The set of connections this connection can conference with.
12307c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon     */
12317c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon    public final void setConferenceableConnections(List<Connection> conferenceableConnections) {
12325c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        checkImmutable();
12337c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon        clearConferenceableList();
12347c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon        for (Connection c : conferenceableConnections) {
12357c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon            // If statement checks for duplicates in input. It makes it N^2 but we're dealing with a
12367c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon            // small amount of items here.
12376d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn            if (!mConferenceables.contains(c)) {
12387c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon                c.addConnectionListener(mConnectionDeathListener);
12396d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn                mConferenceables.add(c);
12407c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon            }
12417c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon        }
12427c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon        fireOnConferenceableConnectionsChanged();
12437c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon    }
12447c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon
12457c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon    /**
12466d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn     * Similar to {@link #setConferenceableConnections(java.util.List)}, sets a list of connections
12476d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn     * or conferences with which this connection can be conferenced.
12486d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn     *
12496d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn     * @param conferenceables The conferenceables.
1250b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad     */
12516d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn    public final void setConferenceables(List<IConferenceable> conferenceables) {
12526d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn        clearConferenceableList();
12536d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn        for (IConferenceable c : conferenceables) {
12546d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn            // If statement checks for duplicates in input. It makes it N^2 but we're dealing with a
12556d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn            // small amount of items here.
12566d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn            if (!mConferenceables.contains(c)) {
12576d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn                if (c instanceof Connection) {
12586d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn                    Connection connection = (Connection) c;
12596d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn                    connection.addConnectionListener(mConnectionDeathListener);
12606d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn                } else if (c instanceof Conference) {
12616d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn                    Conference conference = (Conference) c;
12626d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn                    conference.addListener(mConferenceDeathListener);
12636d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn                }
12646d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn                mConferenceables.add(c);
12656d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn            }
12666d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn        }
12676d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn        fireOnConferenceableConnectionsChanged();
12686d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn    }
12696d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn
12706d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn    /**
12716d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn     * Returns the connections or conferences with which this connection can be conferenced.
12726d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn     */
12736d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn    public final List<IConferenceable> getConferenceables() {
12746d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn        return mUnmodifiableConferenceables;
1275b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad    }
1276b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
12778635c578f0408ca76cbaef5464d27bfde7450425Evan Charlton    /*
1278823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon     * @hide
1279823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon     */
1280823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon    public final void setConnectionService(ConnectionService connectionService) {
12815c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        checkImmutable();
1282823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon        if (mConnectionService != null) {
1283823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon            Log.e(this, new Exception(), "Trying to set ConnectionService on a connection " +
1284823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon                    "which is already associated with another ConnectionService.");
1285823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon        } else {
1286823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon            mConnectionService = connectionService;
1287823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon        }
1288823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon    }
1289823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon
1290823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon    /**
1291823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon     * @hide
1292823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon     */
1293823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon    public final void unsetConnectionService(ConnectionService connectionService) {
1294823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon        if (mConnectionService != connectionService) {
1295823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon            Log.e(this, new Exception(), "Trying to remove ConnectionService from a Connection " +
1296823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon                    "that does not belong to the ConnectionService.");
1297823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon        } else {
1298823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon            mConnectionService = null;
1299823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon        }
1300823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon    }
1301823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon
1302823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon    /**
1303af1b296a41f0b6e3af34e9c2c73bc1029bfa8b2aSantos Cordon     * @hide
1304af1b296a41f0b6e3af34e9c2c73bc1029bfa8b2aSantos Cordon     */
1305af1b296a41f0b6e3af34e9c2c73bc1029bfa8b2aSantos Cordon    public final ConnectionService getConnectionService() {
1306af1b296a41f0b6e3af34e9c2c73bc1029bfa8b2aSantos Cordon        return mConnectionService;
1307af1b296a41f0b6e3af34e9c2c73bc1029bfa8b2aSantos Cordon    }
1308af1b296a41f0b6e3af34e9c2c73bc1029bfa8b2aSantos Cordon
1309af1b296a41f0b6e3af34e9c2c73bc1029bfa8b2aSantos Cordon    /**
1310823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon     * Sets the conference that this connection is a part of. This will fail if the connection is
13115c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * already part of a conference. {@link #resetConference} to un-set the conference first.
1312823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon     *
1313823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon     * @param conference The conference.
1314823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon     * @return {@code true} if the conference was successfully set.
1315823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon     * @hide
1316823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon     */
1317823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon    public final boolean setConference(Conference conference) {
13185c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        checkImmutable();
1319823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon        // We check to see if it is already part of another conference.
13200159ac0cfe20e8f85ee4150e64d91392850f8a3fSantos Cordon        if (mConference == null) {
1321823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon            mConference = conference;
13220159ac0cfe20e8f85ee4150e64d91392850f8a3fSantos Cordon            if (mConnectionService != null && mConnectionService.containsConference(conference)) {
13230159ac0cfe20e8f85ee4150e64d91392850f8a3fSantos Cordon                fireConferenceChanged();
13240159ac0cfe20e8f85ee4150e64d91392850f8a3fSantos Cordon            }
1325823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon            return true;
1326823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon        }
1327823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon        return false;
1328823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon    }
1329823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon
1330823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon    /**
1331823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon     * Resets the conference that this connection is a part of.
1332823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon     * @hide
1333823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon     */
1334823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon    public final void resetConference() {
1335823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon        if (mConference != null) {
13360159ac0cfe20e8f85ee4150e64d91392850f8a3fSantos Cordon            Log.d(this, "Conference reset");
1337823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon            mConference = null;
1338823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon            fireConferenceChanged();
1339823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon        }
1340823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon    }
1341823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon
1342b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad    /**
1343b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad     * Notifies this Connection that the {@link #getAudioState()} property has a new value.
1344400cc48512dc69e940ad4d233a3b47ee9574601dSailesh Nepal     *
13455c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * @param state The new connection audio state.
1346400cc48512dc69e940ad4d233a3b47ee9574601dSailesh Nepal     */
1347354b2bd0fe8647bd5c7e28f3598b9b7414846124Nancy Chen    public void onAudioStateChanged(AudioState state) {}
1348400cc48512dc69e940ad4d233a3b47ee9574601dSailesh Nepal
1349400cc48512dc69e940ad4d233a3b47ee9574601dSailesh Nepal    /**
1350bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton     * Notifies this Connection of an internal state change. This method is called after the
1351bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton     * state is changed.
1352f835897f9f799490de27653ae39141ba6bc14223Ihab Awad     *
1353b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad     * @param state The new state, one of the {@code STATE_*} constants.
1354f835897f9f799490de27653ae39141ba6bc14223Ihab Awad     */
1355354b2bd0fe8647bd5c7e28f3598b9b7414846124Nancy Chen    public void onStateChanged(int state) {}
1356f835897f9f799490de27653ae39141ba6bc14223Ihab Awad
1357f835897f9f799490de27653ae39141ba6bc14223Ihab Awad    /**
1358542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     * Notifies this Connection of a request to play a DTMF tone.
1359542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     *
1360542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     * @param c A DTMF character.
1361542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     */
1362f29511043e1c3bf750e28427410192c793363bf7Santos Cordon    public void onPlayDtmfTone(char c) {}
1363542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad
1364542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad    /**
1365542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     * Notifies this Connection of a request to stop any currently playing DTMF tones.
1366542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     */
1367f29511043e1c3bf750e28427410192c793363bf7Santos Cordon    public void onStopDtmfTone() {}
1368542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad
1369542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad    /**
1370542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     * Notifies this Connection of a request to disconnect.
1371542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     */
1372f29511043e1c3bf750e28427410192c793363bf7Santos Cordon    public void onDisconnect() {}
1373542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad
1374542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad    /**
13753b4b1dcb607b8932374a4bc8c9ab349b9bb68660Tyler Gunn     * Notifies this Connection of a request to disconnect a participant of the conference managed
13763b4b1dcb607b8932374a4bc8c9ab349b9bb68660Tyler Gunn     * by the connection.
13773b4b1dcb607b8932374a4bc8c9ab349b9bb68660Tyler Gunn     *
13783b4b1dcb607b8932374a4bc8c9ab349b9bb68660Tyler Gunn     * @param endpoint the {@link Uri} of the participant to disconnect.
13793b4b1dcb607b8932374a4bc8c9ab349b9bb68660Tyler Gunn     * @hide
13803b4b1dcb607b8932374a4bc8c9ab349b9bb68660Tyler Gunn     */
13813b4b1dcb607b8932374a4bc8c9ab349b9bb68660Tyler Gunn    public void onDisconnectConferenceParticipant(Uri endpoint) {}
13823b4b1dcb607b8932374a4bc8c9ab349b9bb68660Tyler Gunn
13833b4b1dcb607b8932374a4bc8c9ab349b9bb68660Tyler Gunn    /**
13847c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon     * Notifies this Connection of a request to separate from its parent conference.
1385b693998fdfdd4498a33c4c69405f2708e4840aa7Santos Cordon     */
1386f29511043e1c3bf750e28427410192c793363bf7Santos Cordon    public void onSeparate() {}
1387b693998fdfdd4498a33c4c69405f2708e4840aa7Santos Cordon
1388b693998fdfdd4498a33c4c69405f2708e4840aa7Santos Cordon    /**
1389542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     * Notifies this Connection of a request to abort.
1390542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     */
1391f29511043e1c3bf750e28427410192c793363bf7Santos Cordon    public void onAbort() {}
1392542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad
1393542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad    /**
1394542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     * Notifies this Connection of a request to hold.
1395542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     */
1396f29511043e1c3bf750e28427410192c793363bf7Santos Cordon    public void onHold() {}
1397542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad
1398542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad    /**
1399542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     * Notifies this Connection of a request to exit a hold state.
1400542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     */
1401f29511043e1c3bf750e28427410192c793363bf7Santos Cordon    public void onUnhold() {}
1402542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad
1403542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad    /**
1404b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad     * Notifies this Connection, which is in {@link #STATE_RINGING}, of
1405d34e5713c9571859d12e9c2e83ce3946cacdd68eSantos Cordon     * a request to accept.
14068da4c3c11faf066b2b04ba853f03be6f1c4af5d8Andrew Lee     *
14075c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * @param videoState The video state in which to answer the connection.
1408be74de0978a7eaa577f6b61902b550a3161aff8bTyler Gunn     * @hide
1409542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     */
1410f29511043e1c3bf750e28427410192c793363bf7Santos Cordon    public void onAnswer(int videoState) {}
1411542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad
1412542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad    /**
1413b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad     * Notifies this Connection, which is in {@link #STATE_RINGING}, of
1414be74de0978a7eaa577f6b61902b550a3161aff8bTyler Gunn     * a request to accept.
1415be74de0978a7eaa577f6b61902b550a3161aff8bTyler Gunn     */
1416be74de0978a7eaa577f6b61902b550a3161aff8bTyler Gunn    public void onAnswer() {
1417be74de0978a7eaa577f6b61902b550a3161aff8bTyler Gunn        onAnswer(VideoProfile.VideoState.AUDIO_ONLY);
1418be74de0978a7eaa577f6b61902b550a3161aff8bTyler Gunn    }
1419be74de0978a7eaa577f6b61902b550a3161aff8bTyler Gunn
1420be74de0978a7eaa577f6b61902b550a3161aff8bTyler Gunn    /**
1421be74de0978a7eaa577f6b61902b550a3161aff8bTyler Gunn     * Notifies this Connection, which is in {@link #STATE_RINGING}, of
1422d34e5713c9571859d12e9c2e83ce3946cacdd68eSantos Cordon     * a request to reject.
1423542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     */
1424f29511043e1c3bf750e28427410192c793363bf7Santos Cordon    public void onReject() {}
1425542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad
14266dea4aceba8f69ee4be346ec356d277a3c153f3dEvan Charlton    /**
14276dea4aceba8f69ee4be346ec356d277a3c153f3dEvan Charlton     * Notifies this Connection whether the user wishes to proceed with the post-dial DTMF codes.
14286dea4aceba8f69ee4be346ec356d277a3c153f3dEvan Charlton     */
1429f29511043e1c3bf750e28427410192c793363bf7Santos Cordon    public void onPostDialContinue(boolean proceed) {}
14306dea4aceba8f69ee4be346ec356d277a3c153f3dEvan Charlton
1431b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad    static String toLogSafePhoneNumber(String number) {
1432b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        // For unknown number, log empty string.
1433b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        if (number == null) {
1434b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            return "";
1435b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        }
1436b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
1437b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        if (PII_DEBUG) {
1438b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            // When PII_DEBUG is true we emit PII.
1439b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            return number;
1440b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        }
1441b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
1442b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        // Do exactly same thing as Uri#toSafeString() does, which will enable us to compare
1443b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        // sanitized phone numbers.
1444b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        StringBuilder builder = new StringBuilder();
1445b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        for (int i = 0; i < number.length(); i++) {
1446b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            char c = number.charAt(i);
1447b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            if (c == '-' || c == '@' || c == '.') {
1448b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                builder.append(c);
1449b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            } else {
1450b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                builder.append('x');
1451b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            }
1452b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        }
1453b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        return builder.toString();
1454b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad    }
1455b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
1456542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad    private void setState(int state) {
14575c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        checkImmutable();
14586107bab041fb7d851fbf865b7310d294aae970c8Ihab Awad        if (mState == STATE_DISCONNECTED && mState != state) {
14596107bab041fb7d851fbf865b7310d294aae970c8Ihab Awad            Log.d(this, "Connection already DISCONNECTED; cannot transition out of this state.");
1460bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton            return;
1461400cc48512dc69e940ad4d233a3b47ee9574601dSailesh Nepal        }
1462bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton        if (mState != state) {
1463bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton            Log.d(this, "setState: %s", stateToString(state));
1464bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton            mState = state;
1465354b2bd0fe8647bd5c7e28f3598b9b7414846124Nancy Chen            onStateChanged(state);
1466bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton            for (Listener l : mListeners) {
1467bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton                l.onStateChanged(this, state);
1468bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton            }
1469bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton        }
1470bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton    }
1471bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton
1472cf7020b7e84c1f5190db7167d70cb0675cd3332fSailesh Nepal    private static class FailureSignalingConnection extends Connection {
147390e34e324cbe22f18680809cbc33caf63b320cb4Ihab Awad        private boolean mImmutable = false;
14747f3d41fd124dd7c4a8b72c1d48df08a8ee7209ecAndrew Lee        public FailureSignalingConnection(DisconnectCause disconnectCause) {
14757f3d41fd124dd7c4a8b72c1d48df08a8ee7209ecAndrew Lee            setDisconnected(disconnectCause);
147690e34e324cbe22f18680809cbc33caf63b320cb4Ihab Awad            mImmutable = true;
14776107bab041fb7d851fbf865b7310d294aae970c8Ihab Awad        }
14785c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad
14795c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        public void checkImmutable() {
148090e34e324cbe22f18680809cbc33caf63b320cb4Ihab Awad            if (mImmutable) {
148190e34e324cbe22f18680809cbc33caf63b320cb4Ihab Awad                throw new UnsupportedOperationException("Connection is immutable");
148290e34e324cbe22f18680809cbc33caf63b320cb4Ihab Awad            }
14835c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        }
14846107bab041fb7d851fbf865b7310d294aae970c8Ihab Awad    }
14856107bab041fb7d851fbf865b7310d294aae970c8Ihab Awad
1486bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton    /**
14876107bab041fb7d851fbf865b7310d294aae970c8Ihab Awad     * Return a {@code Connection} which represents a failed connection attempt. The returned
14887f3d41fd124dd7c4a8b72c1d48df08a8ee7209ecAndrew Lee     * {@code Connection} will have a {@link android.telecom.DisconnectCause} and as specified,
14897f3d41fd124dd7c4a8b72c1d48df08a8ee7209ecAndrew Lee     * and a {@link #getState()} of {@link #STATE_DISCONNECTED}.
14906107bab041fb7d851fbf865b7310d294aae970c8Ihab Awad     * <p>
14916107bab041fb7d851fbf865b7310d294aae970c8Ihab Awad     * The returned {@code Connection} can be assumed to {@link #destroy()} itself when appropriate,
14926107bab041fb7d851fbf865b7310d294aae970c8Ihab Awad     * so users of this method need not maintain a reference to its return value to destroy it.
1493bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton     *
14947f3d41fd124dd7c4a8b72c1d48df08a8ee7209ecAndrew Lee     * @param disconnectCause The disconnect cause, ({@see android.telecomm.DisconnectCause}).
14956107bab041fb7d851fbf865b7310d294aae970c8Ihab Awad     * @return A {@code Connection} which indicates failure.
1496bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton     */
14977f3d41fd124dd7c4a8b72c1d48df08a8ee7209ecAndrew Lee    public static Connection createFailedConnection(DisconnectCause disconnectCause) {
14987f3d41fd124dd7c4a8b72c1d48df08a8ee7209ecAndrew Lee        return new FailureSignalingConnection(disconnectCause);
1499bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton    }
1500bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton
1501bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton    /**
15025c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * Override to throw an {@link UnsupportedOperationException} if this {@code Connection} is
15035c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * not intended to be mutated, e.g., if it is a marker for failure. Only for framework use;
15045c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * this should never be un-@hide-den.
15055c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     *
15065c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * @hide
15075c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     */
15085c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad    public void checkImmutable() {}
15095c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad
15105c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad    /**
15116107bab041fb7d851fbf865b7310d294aae970c8Ihab Awad     * Return a {@code Connection} which represents a canceled connection attempt. The returned
15126107bab041fb7d851fbf865b7310d294aae970c8Ihab Awad     * {@code Connection} will have state {@link #STATE_DISCONNECTED}, and cannot be moved out of
15136107bab041fb7d851fbf865b7310d294aae970c8Ihab Awad     * that state. This connection should not be used for anything, and no other
15146107bab041fb7d851fbf865b7310d294aae970c8Ihab Awad     * {@code Connection}s should be attempted.
15156107bab041fb7d851fbf865b7310d294aae970c8Ihab Awad     * <p>
15166107bab041fb7d851fbf865b7310d294aae970c8Ihab Awad     * so users of this method need not maintain a reference to its return value to destroy it.
1517bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton     *
15185c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * @return A {@code Connection} which indicates that the underlying connection should
15195c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * be canceled.
1520bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton     */
1521b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad    public static Connection createCanceledConnection() {
15227f3d41fd124dd7c4a8b72c1d48df08a8ee7209ecAndrew Lee        return new FailureSignalingConnection(new DisconnectCause(DisconnectCause.CANCELED));
1523542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad    }
15247c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon
15255c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad    private final void fireOnConferenceableConnectionsChanged() {
15267c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon        for (Listener l : mListeners) {
15276d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn            l.onConferenceablesChanged(this, getConferenceables());
15287c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon        }
15297c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon    }
15307c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon
1531823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon    private final void fireConferenceChanged() {
1532823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon        for (Listener l : mListeners) {
1533823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon            l.onConferenceChanged(this, mConference);
1534823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon        }
1535823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon    }
1536823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon
15377c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon    private final void clearConferenceableList() {
15386d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn        for (IConferenceable c : mConferenceables) {
15396d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn            if (c instanceof Connection) {
15406d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn                Connection connection = (Connection) c;
15416d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn                connection.removeConnectionListener(mConnectionDeathListener);
15426d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn            } else if (c instanceof Conference) {
15436d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn                Conference conference = (Conference) c;
15446d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn                conference.removeListener(mConferenceDeathListener);
15456d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn            }
15467c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon        }
15476d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn        mConferenceables.clear();
15487c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon    }
15493bffcf78b5e4bd8b60543126fc0bdb09808f28f5Tyler Gunn
15503bffcf78b5e4bd8b60543126fc0bdb09808f28f5Tyler Gunn    /**
155117455a3d39350a39eb995897929977d793358365Anthony Lee     * Notifies listeners that the merge request failed.
155217455a3d39350a39eb995897929977d793358365Anthony Lee     *
155317455a3d39350a39eb995897929977d793358365Anthony Lee     * @hide
155417455a3d39350a39eb995897929977d793358365Anthony Lee     */
155517455a3d39350a39eb995897929977d793358365Anthony Lee    protected final void notifyConferenceMergeFailed() {
155617455a3d39350a39eb995897929977d793358365Anthony Lee        for (Listener l : mListeners) {
155717455a3d39350a39eb995897929977d793358365Anthony Lee            l.onConferenceMergeFailed(this);
155817455a3d39350a39eb995897929977d793358365Anthony Lee        }
155917455a3d39350a39eb995897929977d793358365Anthony Lee    }
156017455a3d39350a39eb995897929977d793358365Anthony Lee
156117455a3d39350a39eb995897929977d793358365Anthony Lee    /**
1562ab4650c4563cd46e65ac37f924fee8febfd759c6Tyler Gunn     * Notifies listeners of a change to conference participant(s).
15633bffcf78b5e4bd8b60543126fc0bdb09808f28f5Tyler Gunn     *
1564ab4650c4563cd46e65ac37f924fee8febfd759c6Tyler Gunn     * @param conferenceParticipants The participants.
15653bffcf78b5e4bd8b60543126fc0bdb09808f28f5Tyler Gunn     * @hide
15663bffcf78b5e4bd8b60543126fc0bdb09808f28f5Tyler Gunn     */
1567ab4650c4563cd46e65ac37f924fee8febfd759c6Tyler Gunn    protected final void updateConferenceParticipants(
1568ab4650c4563cd46e65ac37f924fee8febfd759c6Tyler Gunn            List<ConferenceParticipant> conferenceParticipants) {
15693bffcf78b5e4bd8b60543126fc0bdb09808f28f5Tyler Gunn        for (Listener l : mListeners) {
1570ab4650c4563cd46e65ac37f924fee8febfd759c6Tyler Gunn            l.onConferenceParticipantsChanged(this, conferenceParticipants);
15713bffcf78b5e4bd8b60543126fc0bdb09808f28f5Tyler Gunn        }
15723bffcf78b5e4bd8b60543126fc0bdb09808f28f5Tyler Gunn    }
15738a2b1199a6db0c6f2493e96e25ec1d89e3f62769Tyler Gunn
15748a2b1199a6db0c6f2493e96e25ec1d89e3f62769Tyler Gunn    /**
15758a2b1199a6db0c6f2493e96e25ec1d89e3f62769Tyler Gunn     * Notifies listeners that a conference call has been started.
15761cf9b6bec12c027a0d551540a6e01f3ac2d0a9d4Jay Shrauner     * @hide
15778a2b1199a6db0c6f2493e96e25ec1d89e3f62769Tyler Gunn     */
15788a2b1199a6db0c6f2493e96e25ec1d89e3f62769Tyler Gunn    protected void notifyConferenceStarted() {
15798a2b1199a6db0c6f2493e96e25ec1d89e3f62769Tyler Gunn        for (Listener l : mListeners) {
15808a2b1199a6db0c6f2493e96e25ec1d89e3f62769Tyler Gunn            l.onConferenceStarted();
15818a2b1199a6db0c6f2493e96e25ec1d89e3f62769Tyler Gunn        }
15828a2b1199a6db0c6f2493e96e25ec1d89e3f62769Tyler Gunn    }
1583542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad}
1584