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
220e094d926c306c3667bcdf6f23c52cc7181f25f3Evan Charltonimport android.annotation.SystemApi;
23542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awadimport android.net.Uri;
24b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awadimport android.os.Handler;
25b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awadimport android.os.IBinder;
26b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awadimport android.os.Message;
27b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awadimport android.os.RemoteException;
28b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awadimport android.view.Surface;
29542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad
30b693998fdfdd4498a33c4c69405f2708e4840aa7Santos Cordonimport java.util.ArrayList;
31b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awadimport java.util.Collections;
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.
470e094d926c306c3667bcdf6f23c52cc7181f25f3Evan Charlton * @hide
48542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad */
490e094d926c306c3667bcdf6f23c52cc7181f25f3Evan Charlton@SystemApi
506d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunnpublic abstract class Connection implements IConferenceable {
51542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad
52b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad    public static final int STATE_INITIALIZING = 0;
53b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
54b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad    public static final int STATE_NEW = 1;
55b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
56b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad    public static final int STATE_RINGING = 2;
57b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
58b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad    public static final int STATE_DIALING = 3;
59b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
60b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad    public static final int STATE_ACTIVE = 4;
61b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
62b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad    public static final int STATE_HOLDING = 5;
63b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
64b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad    public static final int STATE_DISCONNECTED = 6;
65b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
665c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad    /** Connection can currently be put on hold or unheld. */
675c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad    public static final int CAPABILITY_HOLD = 0x00000001;
685c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad
695c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad    /** Connection supports the hold feature. */
705c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad    public static final int CAPABILITY_SUPPORT_HOLD = 0x00000002;
715c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad
725c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad    /**
735c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * Connections within a conference can be merged. A {@link ConnectionService} has the option to
745c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * add a {@link Conference} before the child {@link Connection}s are merged. This is how
755c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * CDMA-based {@link Connection}s are implemented. For these unmerged {@link Conference}s, this
765c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * capability allows a merge button to be shown while the conference is in the foreground
775c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * of the in-call UI.
785c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * <p>
795c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * This is only intended for use by a {@link Conference}.
805c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     */
815c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad    public static final int CAPABILITY_MERGE_CONFERENCE = 0x00000004;
825c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad
835c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad    /**
845c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * Connections within a conference can be swapped between foreground and background.
855c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * See {@link #CAPABILITY_MERGE_CONFERENCE} for additional information.
865c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * <p>
875c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * This is only intended for use by a {@link Conference}.
885c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     */
895c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad    public static final int CAPABILITY_SWAP_CONFERENCE = 0x00000008;
905c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad
915c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad    /**
925c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * @hide
935c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     */
945c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad    public static final int CAPABILITY_UNUSED = 0x00000010;
955c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad
965c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad    /** Connection supports responding via text option. */
975c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad    public static final int CAPABILITY_RESPOND_VIA_TEXT = 0x00000020;
985c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad
995c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad    /** Connection can be muted. */
1005c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad    public static final int CAPABILITY_MUTE = 0x00000040;
1015c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad
1025c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad    /**
1035c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * Connection supports conference management. This capability only applies to
1045c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * {@link Conference}s which can have {@link Connection}s as children.
1055c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     */
1065c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad    public static final int CAPABILITY_MANAGE_CONFERENCE = 0x00000080;
1075c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad
1085c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad    /**
1095c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * Local device supports video telephony.
1105c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * @hide
1115c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     */
1125c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad    public static final int CAPABILITY_SUPPORTS_VT_LOCAL = 0x00000100;
1135c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad
1145c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad    /**
1155c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * Remote device supports video telephony.
1165c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * @hide
1175c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     */
1185c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad    public static final int CAPABILITY_SUPPORTS_VT_REMOTE = 0x00000200;
1195c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad
1205c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad    /**
12180fff3c0a5f68d4b426a35468daeaf4ff4d3d375Andrew Lee     * Connection is using high definition audio.
1225c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * @hide
1235c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     */
12480fff3c0a5f68d4b426a35468daeaf4ff4d3d375Andrew Lee    public static final int CAPABILITY_HIGH_DEF_AUDIO = 0x00000400;
1255c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad
1265c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad    /**
1275c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * Connection is using voice over WIFI.
1285c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * @hide
1295c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     */
1305c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad    public static final int CAPABILITY_VoWIFI = 0x00000800;
1315c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad
1325c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad    /**
1335c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * Connection is able to be separated from its parent {@code Conference}, if any.
1345c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     */
1355c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad    public static final int CAPABILITY_SEPARATE_FROM_CONFERENCE = 0x00001000;
1365c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad
1375c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad    /**
1385c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * Connection is able to be individually disconnected when in a {@code Conference}.
1395c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     */
1405c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad    public static final int CAPABILITY_DISCONNECT_FROM_CONFERENCE = 0x00002000;
1415c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad
1425c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad    /**
1435c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * Whether the call is a generic conference, where we do not know the precise state of
1445c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * participants in the conference (eg. on CDMA).
1455c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     *
1465c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * @hide
1475c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     */
1485c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad    public static final int CAPABILITY_GENERIC_CONFERENCE = 0x00004000;
1495c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad
150a4e0ab6edf3836204a9353bb52d1c66cf2f3a85aDong Zhou    /**
151a4e0ab6edf3836204a9353bb52d1c66cf2f3a85aDong Zhou     * Speed up audio setup for MT call.
152a4e0ab6edf3836204a9353bb52d1c66cf2f3a85aDong Zhou     * @hide
153a4e0ab6edf3836204a9353bb52d1c66cf2f3a85aDong Zhou    */
154a4e0ab6edf3836204a9353bb52d1c66cf2f3a85aDong Zhou    public static final int CAPABILITY_SPEED_UP_MT_AUDIO = 0x00008000;
155a4e0ab6edf3836204a9353bb52d1c66cf2f3a85aDong Zhou
156b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad    // Flag controlling whether PII is emitted into the logs
157b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad    private static final boolean PII_DEBUG = Log.isLoggable(android.util.Log.DEBUG);
158b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
1595c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad    /**
1605c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * Whether the given capabilities support the specified capability.
1615c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     *
1625c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * @param capabilities A capability bit field.
1635c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * @param capability The capability to check capabilities for.
1645c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * @return Whether the specified capability is supported.
1655c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * @hide
1665c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     */
1675c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad    public static boolean can(int capabilities, int capability) {
1685c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        return (capabilities & capability) != 0;
1695c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad    }
1705c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad
1715c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad    /**
1725c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * Whether the capabilities of this {@code Connection} supports the specified capability.
1735c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     *
1745c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * @param capability The capability to check capabilities for.
1755c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * @return Whether the specified capability is supported.
1765c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * @hide
1775c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     */
1785c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad    public boolean can(int capability) {
1795c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        return can(mConnectionCapabilities, capability);
1805c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad    }
1815c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad
1825c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad    /**
1835c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * Removes the specified capability from the set of capabilities of this {@code Connection}.
1845c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     *
1855c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * @param capability The capability to remove from the set.
1865c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * @hide
1875c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     */
1885c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad    public void removeCapability(int capability) {
1895c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        mConnectionCapabilities &= ~capability;
1905c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad    }
1915c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad
1925c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad    /**
1935c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * Adds the specified capability to the set of capabilities of this {@code Connection}.
1945c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     *
1955c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * @param capability The capability to add to the set.
1965c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * @hide
1975c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     */
1985c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad    public void addCapability(int capability) {
1995c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        mConnectionCapabilities |= capability;
2005c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad    }
2015c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad
2025c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad
2035c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad    public static String capabilitiesToString(int capabilities) {
2045c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        StringBuilder builder = new StringBuilder();
2055c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        builder.append("[Capabilities:");
2065c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        if (can(capabilities, CAPABILITY_HOLD)) {
2075c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad            builder.append(" CAPABILITY_HOLD");
2085c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        }
2095c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        if (can(capabilities, CAPABILITY_SUPPORT_HOLD)) {
2105c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad            builder.append(" CAPABILITY_SUPPORT_HOLD");
2115c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        }
2125c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        if (can(capabilities, CAPABILITY_MERGE_CONFERENCE)) {
2135c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad            builder.append(" CAPABILITY_MERGE_CONFERENCE");
2145c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        }
2155c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        if (can(capabilities, CAPABILITY_SWAP_CONFERENCE)) {
2165c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad            builder.append(" CAPABILITY_SWAP_CONFERENCE");
2175c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        }
2185c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        if (can(capabilities, CAPABILITY_RESPOND_VIA_TEXT)) {
2195c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad            builder.append(" CAPABILITY_RESPOND_VIA_TEXT");
2205c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        }
2215c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        if (can(capabilities, CAPABILITY_MUTE)) {
2225c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad            builder.append(" CAPABILITY_MUTE");
2235c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        }
2245c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        if (can(capabilities, CAPABILITY_MANAGE_CONFERENCE)) {
2255c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad            builder.append(" CAPABILITY_MANAGE_CONFERENCE");
2265c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        }
2275c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        if (can(capabilities, CAPABILITY_SUPPORTS_VT_LOCAL)) {
2285c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad            builder.append(" CAPABILITY_SUPPORTS_VT_LOCAL");
2295c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        }
2305c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        if (can(capabilities, CAPABILITY_SUPPORTS_VT_REMOTE)) {
2315c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad            builder.append(" CAPABILITY_SUPPORTS_VT_REMOTE");
2325c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        }
23380fff3c0a5f68d4b426a35468daeaf4ff4d3d375Andrew Lee        if (can(capabilities, CAPABILITY_HIGH_DEF_AUDIO)) {
23480fff3c0a5f68d4b426a35468daeaf4ff4d3d375Andrew Lee            builder.append(" CAPABILITY_HIGH_DEF_AUDIO");
2355c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        }
2365c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        if (can(capabilities, CAPABILITY_VoWIFI)) {
2375c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad            builder.append(" CAPABILITY_VoWIFI");
2385c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        }
2395c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        if (can(capabilities, CAPABILITY_GENERIC_CONFERENCE)) {
2405c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad            builder.append(" CAPABILITY_GENERIC_CONFERENCE");
2415c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        }
242a4e0ab6edf3836204a9353bb52d1c66cf2f3a85aDong Zhou        if (can(capabilities, CAPABILITY_SPEED_UP_MT_AUDIO)) {
243a4e0ab6edf3836204a9353bb52d1c66cf2f3a85aDong Zhou            builder.append(" CAPABILITY_SPEED_UP_IMS_MT_AUDIO");
244a4e0ab6edf3836204a9353bb52d1c66cf2f3a85aDong Zhou        }
2455c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        builder.append("]");
2465c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        return builder.toString();
2475c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad    }
2485c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad
249091768c3021d740b7d66846d36405c4d4c76cc56Sailesh Nepal    /** @hide */
250612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepal    public abstract static class Listener {
251542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad        public void onStateChanged(Connection c, int state) {}
252100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee        public void onAddressChanged(Connection c, Uri newAddress, int presentation) {}
253612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepal        public void onCallerDisplayNameChanged(
254612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepal                Connection c, String callerDisplayName, int presentation) {}
255aa07df84f279a87ad6370758c9d792a660f2cebbTyler Gunn        public void onVideoStateChanged(Connection c, int videoState) {}
2567f3d41fd124dd7c4a8b72c1d48df08a8ee7209ecAndrew Lee        public void onDisconnected(Connection c, DisconnectCause disconnectCause) {}
257091768c3021d740b7d66846d36405c4d4c76cc56Sailesh Nepal        public void onPostDialWait(Connection c, String remaining) {}
25827d1c2d148fe377ca0d2744f0f85789a42c8f808Nancy Chen        public void onPostDialChar(Connection c, char nextChar) {}
259100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee        public void onRingbackRequested(Connection c, boolean ringback) {}
260612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepal        public void onDestroyed(Connection c) {}
2615c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        public void onConnectionCapabilitiesChanged(Connection c, int capabilities) {}
262b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        public void onVideoProviderChanged(
263b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                Connection c, VideoProvider videoProvider) {}
264001bbbb239d4ef1005a87039c7c53e26d8f13ad6Sailesh Nepal        public void onAudioModeIsVoipChanged(Connection c, boolean isVoip) {}
265001bbbb239d4ef1005a87039c7c53e26d8f13ad6Sailesh Nepal        public void onStatusHintsChanged(Connection c, StatusHints statusHints) {}
2666d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn        public void onConferenceablesChanged(
2676d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn                Connection c, List<IConferenceable> conferenceables) {}
268823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon        public void onConferenceChanged(Connection c, Conference conference) {}
2693bffcf78b5e4bd8b60543126fc0bdb09808f28f5Tyler Gunn        /** @hide */
270ab4650c4563cd46e65ac37f924fee8febfd759c6Tyler Gunn        public void onConferenceParticipantsChanged(Connection c,
271ab4650c4563cd46e65ac37f924fee8febfd759c6Tyler Gunn                List<ConferenceParticipant> participants) {}
2728a2b1199a6db0c6f2493e96e25ec1d89e3f62769Tyler Gunn        public void onConferenceStarted() {}
273542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad    }
274542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad
27527d1e257f3cba2d5954e5562db69035df9ecf290Tyler Gunn    /** @hide */
276b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad    public static abstract class VideoProvider {
277b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
278b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        /**
279b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * Video is not being received (no protocol pause was issued).
280b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         */
281b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        public static final int SESSION_EVENT_RX_PAUSE = 1;
282b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
283b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        /**
284b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * Video reception has resumed after a SESSION_EVENT_RX_PAUSE.
285b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         */
286b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        public static final int SESSION_EVENT_RX_RESUME = 2;
287b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
288b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        /**
289b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * Video transmission has begun. This occurs after a negotiated start of video transmission
290b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * when the underlying protocol has actually begun transmitting video to the remote party.
291b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         */
292b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        public static final int SESSION_EVENT_TX_START = 3;
293b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
294b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        /**
295b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * Video transmission has stopped. This occurs after a negotiated stop of video transmission
296b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * when the underlying protocol has actually stopped transmitting video to the remote party.
297b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         */
298b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        public static final int SESSION_EVENT_TX_STOP = 4;
299b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
300b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        /**
301b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * A camera failure has occurred for the selected camera.  The In-Call UI can use this as a
302b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * cue to inform the user the camera is not available.
303b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         */
304b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        public static final int SESSION_EVENT_CAMERA_FAILURE = 5;
305b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
306b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        /**
307b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * Issued after {@code SESSION_EVENT_CAMERA_FAILURE} when the camera is once again ready for
308b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * operation.  The In-Call UI can use this as a cue to inform the user that the camera has
309b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * become available again.
310b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         */
311b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        public static final int SESSION_EVENT_CAMERA_READY = 6;
312b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
313b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        /**
314b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * Session modify request was successful.
315b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         */
316b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        public static final int SESSION_MODIFY_REQUEST_SUCCESS = 1;
317b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
318b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        /**
319b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * Session modify request failed.
320b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         */
321b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        public static final int SESSION_MODIFY_REQUEST_FAIL = 2;
322b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
323b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        /**
324b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * Session modify request ignored due to invalid parameters.
325b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         */
326b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        public static final int SESSION_MODIFY_REQUEST_INVALID = 3;
327b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
328a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad        private static final int MSG_SET_VIDEO_CALLBACK = 1;
329b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        private static final int MSG_SET_CAMERA = 2;
330b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        private static final int MSG_SET_PREVIEW_SURFACE = 3;
331b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        private static final int MSG_SET_DISPLAY_SURFACE = 4;
332b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        private static final int MSG_SET_DEVICE_ORIENTATION = 5;
333b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        private static final int MSG_SET_ZOOM = 6;
334b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        private static final int MSG_SEND_SESSION_MODIFY_REQUEST = 7;
335b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        private static final int MSG_SEND_SESSION_MODIFY_RESPONSE = 8;
336b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        private static final int MSG_REQUEST_CAMERA_CAPABILITIES = 9;
3375c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        private static final int MSG_REQUEST_CONNECTION_DATA_USAGE = 10;
338b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        private static final int MSG_SET_PAUSE_IMAGE = 11;
339b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
340b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        private final VideoProvider.VideoProviderHandler
341b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                mMessageHandler = new VideoProvider.VideoProviderHandler();
342b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        private final VideoProvider.VideoProviderBinder mBinder;
343a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad        private IVideoCallback mVideoCallback;
344b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
345b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        /**
346b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * Default handler used to consolidate binder method calls onto a single thread.
347b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         */
348b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        private final class VideoProviderHandler extends Handler {
349b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            @Override
350b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            public void handleMessage(Message msg) {
351b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                switch (msg.what) {
352a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad                    case MSG_SET_VIDEO_CALLBACK:
353a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad                        mVideoCallback = IVideoCallback.Stub.asInterface((IBinder) msg.obj);
354b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                        break;
355b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                    case MSG_SET_CAMERA:
356b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                        onSetCamera((String) msg.obj);
357b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                        break;
358b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                    case MSG_SET_PREVIEW_SURFACE:
359b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                        onSetPreviewSurface((Surface) msg.obj);
360b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                        break;
361b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                    case MSG_SET_DISPLAY_SURFACE:
362b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                        onSetDisplaySurface((Surface) msg.obj);
363b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                        break;
364b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                    case MSG_SET_DEVICE_ORIENTATION:
365b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                        onSetDeviceOrientation(msg.arg1);
366b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                        break;
367b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                    case MSG_SET_ZOOM:
368b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                        onSetZoom((Float) msg.obj);
369b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                        break;
370b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                    case MSG_SEND_SESSION_MODIFY_REQUEST:
371b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                        onSendSessionModifyRequest((VideoProfile) msg.obj);
372b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                        break;
373b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                    case MSG_SEND_SESSION_MODIFY_RESPONSE:
374b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                        onSendSessionModifyResponse((VideoProfile) msg.obj);
375b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                        break;
376b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                    case MSG_REQUEST_CAMERA_CAPABILITIES:
377b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                        onRequestCameraCapabilities();
378b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                        break;
3795c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad                    case MSG_REQUEST_CONNECTION_DATA_USAGE:
3805c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad                        onRequestConnectionDataUsage();
381b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                        break;
382b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                    case MSG_SET_PAUSE_IMAGE:
383b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                        onSetPauseImage((String) msg.obj);
384b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                        break;
385b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                    default:
386b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                        break;
387b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                }
388b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            }
389b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        }
390b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
391b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        /**
392b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * IVideoProvider stub implementation.
393b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         */
394b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        private final class VideoProviderBinder extends IVideoProvider.Stub {
395a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad            public void setVideoCallback(IBinder videoCallbackBinder) {
396b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                mMessageHandler.obtainMessage(
397a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad                        MSG_SET_VIDEO_CALLBACK, videoCallbackBinder).sendToTarget();
398b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            }
399b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
400b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            public void setCamera(String cameraId) {
401b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                mMessageHandler.obtainMessage(MSG_SET_CAMERA, cameraId).sendToTarget();
402b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            }
403b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
404b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            public void setPreviewSurface(Surface surface) {
405b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                mMessageHandler.obtainMessage(MSG_SET_PREVIEW_SURFACE, surface).sendToTarget();
406b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            }
407b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
408b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            public void setDisplaySurface(Surface surface) {
409b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                mMessageHandler.obtainMessage(MSG_SET_DISPLAY_SURFACE, surface).sendToTarget();
410b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            }
411b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
412b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            public void setDeviceOrientation(int rotation) {
413b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                mMessageHandler.obtainMessage(MSG_SET_DEVICE_ORIENTATION, rotation).sendToTarget();
414b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            }
415b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
416b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            public void setZoom(float value) {
417b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                mMessageHandler.obtainMessage(MSG_SET_ZOOM, value).sendToTarget();
418b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            }
419b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
420b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            public void sendSessionModifyRequest(VideoProfile requestProfile) {
421b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                mMessageHandler.obtainMessage(
422b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                        MSG_SEND_SESSION_MODIFY_REQUEST, requestProfile).sendToTarget();
423b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            }
424b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
425b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            public void sendSessionModifyResponse(VideoProfile responseProfile) {
426b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                mMessageHandler.obtainMessage(
427b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                        MSG_SEND_SESSION_MODIFY_RESPONSE, responseProfile).sendToTarget();
428b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            }
429b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
430b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            public void requestCameraCapabilities() {
431b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                mMessageHandler.obtainMessage(MSG_REQUEST_CAMERA_CAPABILITIES).sendToTarget();
432b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            }
433b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
434b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            public void requestCallDataUsage() {
4355c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad                mMessageHandler.obtainMessage(MSG_REQUEST_CONNECTION_DATA_USAGE).sendToTarget();
436b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            }
437b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
438b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            public void setPauseImage(String uri) {
439b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                mMessageHandler.obtainMessage(MSG_SET_PAUSE_IMAGE, uri).sendToTarget();
440b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            }
441b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        }
442b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
443b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        public VideoProvider() {
444b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            mBinder = new VideoProvider.VideoProviderBinder();
445b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        }
446b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
447b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        /**
448b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * Returns binder object which can be used across IPC methods.
449b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * @hide
450b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         */
451b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        public final IVideoProvider getInterface() {
452b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            return mBinder;
453b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        }
454b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
455b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        /**
4565c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad         * Sets the camera to be used for video recording in a video connection.
457b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         *
458b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * @param cameraId The id of the camera.
459b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         */
460b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        public abstract void onSetCamera(String cameraId);
461b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
462b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        /**
463b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * Sets the surface to be used for displaying a preview of what the user's camera is
464b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * currently capturing.  When video transmission is enabled, this is the video signal which
465b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * is sent to the remote device.
466b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         *
467b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * @param surface The surface.
468b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         */
469b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        public abstract void onSetPreviewSurface(Surface surface);
470b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
471b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        /**
472b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * Sets the surface to be used for displaying the video received from the remote device.
473b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         *
474b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * @param surface The surface.
475b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         */
476b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        public abstract void onSetDisplaySurface(Surface surface);
477b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
478b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        /**
479b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * Sets the device orientation, in degrees.  Assumes that a standard portrait orientation of
480b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * the device is 0 degrees.
481b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         *
482b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * @param rotation The device orientation, in degrees.
483b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         */
484b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        public abstract void onSetDeviceOrientation(int rotation);
485b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
486b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        /**
487b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * Sets camera zoom ratio.
488b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         *
489b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * @param value The camera zoom ratio.
490b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         */
491b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        public abstract void onSetZoom(float value);
492b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
493b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        /**
494b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * Issues a request to modify the properties of the current session.  The request is
495b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * sent to the remote device where it it handled by the In-Call UI.
4965c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad         * Some examples of session modification requests: upgrade connection from audio to video,
4975c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad         * downgrade connection from video to audio, pause video.
498b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         *
4995c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad         * @param requestProfile The requested connection video properties.
500b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         */
501b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        public abstract void onSendSessionModifyRequest(VideoProfile requestProfile);
502b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
503b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        /**te
5045c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad         * Provides a response to a request to change the current connection session video
505b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * properties.
506b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * This is in response to a request the InCall UI has received via the InCall UI.
507b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         *
5085c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad         * @param responseProfile The response connection video properties.
509b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         */
510b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        public abstract void onSendSessionModifyResponse(VideoProfile responseProfile);
511b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
512b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        /**
513b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * Issues a request to the video provider to retrieve the camera capabilities.
514b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * Camera capabilities are reported back to the caller via the In-Call UI.
515b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         */
516b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        public abstract void onRequestCameraCapabilities();
517b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
518b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        /**
519b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * Issues a request to the video telephony framework to retrieve the cumulative data usage
5205c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad         * for the current connection.  Data usage is reported back to the caller via the
521b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * InCall UI.
522b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         */
5235c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        public abstract void onRequestConnectionDataUsage();
524b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
525b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        /**
526b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * Provides the video telephony framework with the URI of an image to be displayed to remote
527b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * devices when the video signal is paused.
528b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         *
529b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * @param uri URI of image to display.
530b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         */
531b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        public abstract void onSetPauseImage(String uri);
532b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
533b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        /**
534b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * Invokes callback method defined in In-Call UI.
535b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         *
5365c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad         * @param videoProfile The requested video connection profile.
537b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         */
538b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        public void receiveSessionModifyRequest(VideoProfile videoProfile) {
539a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad            if (mVideoCallback != null) {
540b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                try {
541a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad                    mVideoCallback.receiveSessionModifyRequest(videoProfile);
542b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                } catch (RemoteException ignored) {
543b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                }
544b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            }
545b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        }
546b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
547b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        /**
548b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * Invokes callback method defined in In-Call UI.
549b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         *
550b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * @param status Status of the session modify request.  Valid values are
551b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         *               {@link VideoProvider#SESSION_MODIFY_REQUEST_SUCCESS},
552b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         *               {@link VideoProvider#SESSION_MODIFY_REQUEST_FAIL},
553b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         *               {@link VideoProvider#SESSION_MODIFY_REQUEST_INVALID}
554b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * @param requestedProfile The original request which was sent to the remote device.
555b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * @param responseProfile The actual profile changes made by the remote device.
556b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         */
557b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        public void receiveSessionModifyResponse(int status,
558b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                VideoProfile requestedProfile, VideoProfile responseProfile) {
559a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad            if (mVideoCallback != null) {
560b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                try {
561a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad                    mVideoCallback.receiveSessionModifyResponse(
562b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                            status, requestedProfile, responseProfile);
563b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                } catch (RemoteException ignored) {
564b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                }
565b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            }
566b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        }
567542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad
568b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        /**
569b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * Invokes callback method defined in In-Call UI.
570b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         *
571b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * Valid values are: {@link VideoProvider#SESSION_EVENT_RX_PAUSE},
572b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * {@link VideoProvider#SESSION_EVENT_RX_RESUME},
573b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * {@link VideoProvider#SESSION_EVENT_TX_START},
574b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * {@link VideoProvider#SESSION_EVENT_TX_STOP}
575b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         *
576b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * @param event The event.
577b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         */
578b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        public void handleCallSessionEvent(int event) {
579a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad            if (mVideoCallback != null) {
580b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                try {
581a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad                    mVideoCallback.handleCallSessionEvent(event);
582b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                } catch (RemoteException ignored) {
583b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                }
584b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            }
585b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        }
586b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
587b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        /**
588b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * Invokes callback method defined in In-Call UI.
589b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         *
590b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * @param width  The updated peer video width.
591b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * @param height The updated peer video height.
592b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         */
593b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        public void changePeerDimensions(int width, int height) {
594a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad            if (mVideoCallback != null) {
595b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                try {
596a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad                    mVideoCallback.changePeerDimensions(width, height);
597b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                } catch (RemoteException ignored) {
598b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                }
599b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            }
600b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        }
601bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton
602b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        /**
603b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * Invokes callback method defined in In-Call UI.
604b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         *
605b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * @param dataUsage The updated data usage.
606b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         */
607b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        public void changeCallDataUsage(int dataUsage) {
608a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad            if (mVideoCallback != null) {
609b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                try {
610a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad                    mVideoCallback.changeCallDataUsage(dataUsage);
611b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                } catch (RemoteException ignored) {
612b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                }
613b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            }
614b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        }
615b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
616b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        /**
617b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * Invokes callback method defined in In-Call UI.
618b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         *
619b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * @param cameraCapabilities The changed camera capabilities.
620b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         */
621b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        public void changeCameraCapabilities(CameraCapabilities cameraCapabilities) {
622a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad            if (mVideoCallback != null) {
623b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                try {
624a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad                    mVideoCallback.changeCameraCapabilities(cameraCapabilities);
625b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                } catch (RemoteException ignored) {
626b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                }
627b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            }
628b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        }
629542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad    }
630542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad
6317c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon    private final Listener mConnectionDeathListener = new Listener() {
6327c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon        @Override
6337c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon        public void onDestroyed(Connection c) {
6346d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn            if (mConferenceables.remove(c)) {
6356d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn                fireOnConferenceableConnectionsChanged();
6366d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn            }
6376d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn        }
6386d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn    };
6396d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn
6406d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn    private final Conference.Listener mConferenceDeathListener = new Conference.Listener() {
6416d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn        @Override
6426d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn        public void onDestroyed(Conference c) {
6436d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn            if (mConferenceables.remove(c)) {
6447c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon                fireOnConferenceableConnectionsChanged();
6457c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon            }
6467c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon        }
6477c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon    };
6487c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon
649229e3820dce98f64fd4834d5f421faec9a9d7026Jay Shrauner    /**
650229e3820dce98f64fd4834d5f421faec9a9d7026Jay Shrauner     * ConcurrentHashMap constructor params: 8 is initial table size, 0.9f is
651229e3820dce98f64fd4834d5f421faec9a9d7026Jay Shrauner     * load factor before resizing, 1 means we only expect a single thread to
652229e3820dce98f64fd4834d5f421faec9a9d7026Jay Shrauner     * access the map so make only a single shard
653229e3820dce98f64fd4834d5f421faec9a9d7026Jay Shrauner     */
654229e3820dce98f64fd4834d5f421faec9a9d7026Jay Shrauner    private final Set<Listener> mListeners = Collections.newSetFromMap(
655229e3820dce98f64fd4834d5f421faec9a9d7026Jay Shrauner            new ConcurrentHashMap<Listener, Boolean>(8, 0.9f, 1));
6566d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn    private final List<IConferenceable> mConferenceables = new ArrayList<>();
6576d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn    private final List<IConferenceable> mUnmodifiableConferenceables =
6586d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn            Collections.unmodifiableList(mConferenceables);
659b693998fdfdd4498a33c4c69405f2708e4840aa7Santos Cordon
660b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad    private int mState = STATE_NEW;
661b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad    private AudioState mAudioState;
662100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee    private Uri mAddress;
663100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee    private int mAddressPresentation;
664612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepal    private String mCallerDisplayName;
665612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepal    private int mCallerDisplayNamePresentation;
666100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee    private boolean mRingbackRequested = false;
6675c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad    private int mConnectionCapabilities;
668b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad    private VideoProvider mVideoProvider;
66933aaae4a07fdcce223fe74d96d751f4bffa6723aSailesh Nepal    private boolean mAudioModeIsVoip;
670e7ef59a77d55c9802cc7d919f7dd794bd5fea30eSailesh Nepal    private StatusHints mStatusHints;
671aa07df84f279a87ad6370758c9d792a660f2cebbTyler Gunn    private int mVideoState;
6727f3d41fd124dd7c4a8b72c1d48df08a8ee7209ecAndrew Lee    private DisconnectCause mDisconnectCause;
673823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon    private Conference mConference;
674823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon    private ConnectionService mConnectionService;
675542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad
676542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad    /**
677542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     * Create a new Connection.
678542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     */
679f29511043e1c3bf750e28427410192c793363bf7Santos Cordon    public Connection() {}
680542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad
681542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad    /**
682100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee     * @return The address (e.g., phone number) to which this Connection is currently communicating.
683542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     */
684100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee    public final Uri getAddress() {
685100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee        return mAddress;
686542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad    }
687542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad
688542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad    /**
689100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee     * @return The presentation requirements for the address.
690ef9f6f957d897ea0ed82114185b8fa3fefd4917bTyler Gunn     *         See {@link TelecomManager} for valid values.
691542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     */
692100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee    public final int getAddressPresentation() {
693100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee        return mAddressPresentation;
694612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepal    }
695612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepal
696612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepal    /**
697612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepal     * @return The caller display name (CNAP).
698612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepal     */
699612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepal    public final String getCallerDisplayName() {
700612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepal        return mCallerDisplayName;
701612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepal    }
702612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepal
703612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepal    /**
7049d568c01db1f90fbe9cbff1d9385e7e7b809e066Nancy Chen     * @return The presentation requirements for the handle.
705ef9f6f957d897ea0ed82114185b8fa3fefd4917bTyler Gunn     *         See {@link TelecomManager} for valid values.
706612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepal     */
707612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepal    public final int getCallerDisplayNamePresentation() {
708612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepal        return mCallerDisplayNamePresentation;
709542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad    }
710542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad
711542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad    /**
712612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepal     * @return The state of this Connection.
7138d83fa9bbd2ad15299a4419241eb10404e7839beTyler Gunn     */
714612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepal    public final int getState() {
715612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepal        return mState;
7162a46b90222e5c9c73de012382a604a71f9c0c30cSailesh Nepal    }
7178d83fa9bbd2ad15299a4419241eb10404e7839beTyler Gunn
7188d83fa9bbd2ad15299a4419241eb10404e7839beTyler Gunn    /**
7195c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * Returns the video state of the connection.
720b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad     * Valid values: {@link VideoProfile.VideoState#AUDIO_ONLY},
721b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad     * {@link VideoProfile.VideoState#BIDIRECTIONAL},
722b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad     * {@link VideoProfile.VideoState#TX_ENABLED},
723b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad     * {@link VideoProfile.VideoState#RX_ENABLED}.
724aa07df84f279a87ad6370758c9d792a660f2cebbTyler Gunn     *
7255c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * @return The video state of the connection.
72627d1e257f3cba2d5954e5562db69035df9ecf290Tyler Gunn     * @hide
727aa07df84f279a87ad6370758c9d792a660f2cebbTyler Gunn     */
728aa07df84f279a87ad6370758c9d792a660f2cebbTyler Gunn    public final int getVideoState() {
729aa07df84f279a87ad6370758c9d792a660f2cebbTyler Gunn        return mVideoState;
730aa07df84f279a87ad6370758c9d792a660f2cebbTyler Gunn    }
731aa07df84f279a87ad6370758c9d792a660f2cebbTyler Gunn
732aa07df84f279a87ad6370758c9d792a660f2cebbTyler Gunn    /**
7335c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * @return The audio state of the connection, describing how its audio is currently
734542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     *         being routed by the system. This is {@code null} if this Connection
735542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     *         does not directly know about its audio state.
736542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     */
737b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad    public final AudioState getAudioState() {
738b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        return mAudioState;
739542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad    }
740542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad
741542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad    /**
742823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon     * @return The conference that this connection is a part of.  Null if it is not part of any
743823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon     *         conference.
7442a46b90222e5c9c73de012382a604a71f9c0c30cSailesh Nepal     */
745823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon    public final Conference getConference() {
746823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon        return mConference;
7472a46b90222e5c9c73de012382a604a71f9c0c30cSailesh Nepal    }
7482a46b90222e5c9c73de012382a604a71f9c0c30cSailesh Nepal
7492a46b90222e5c9c73de012382a604a71f9c0c30cSailesh Nepal    /**
750823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon     * Returns whether this connection is requesting that the system play a ringback tone
751823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon     * on its behalf.
7522a46b90222e5c9c73de012382a604a71f9c0c30cSailesh Nepal     */
753100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee    public final boolean isRingbackRequested() {
754100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee        return mRingbackRequested;
7552a46b90222e5c9c73de012382a604a71f9c0c30cSailesh Nepal    }
7562a46b90222e5c9c73de012382a604a71f9c0c30cSailesh Nepal
7572a46b90222e5c9c73de012382a604a71f9c0c30cSailesh Nepal    /**
75833aaae4a07fdcce223fe74d96d751f4bffa6723aSailesh Nepal     * @return True if the connection's audio mode is VOIP.
75933aaae4a07fdcce223fe74d96d751f4bffa6723aSailesh Nepal     */
76033aaae4a07fdcce223fe74d96d751f4bffa6723aSailesh Nepal    public final boolean getAudioModeIsVoip() {
76133aaae4a07fdcce223fe74d96d751f4bffa6723aSailesh Nepal        return mAudioModeIsVoip;
76233aaae4a07fdcce223fe74d96d751f4bffa6723aSailesh Nepal    }
76333aaae4a07fdcce223fe74d96d751f4bffa6723aSailesh Nepal
76433aaae4a07fdcce223fe74d96d751f4bffa6723aSailesh Nepal    /**
765e7ef59a77d55c9802cc7d919f7dd794bd5fea30eSailesh Nepal     * @return The status hints for this connection.
766e7ef59a77d55c9802cc7d919f7dd794bd5fea30eSailesh Nepal     */
767e7ef59a77d55c9802cc7d919f7dd794bd5fea30eSailesh Nepal    public final StatusHints getStatusHints() {
768e7ef59a77d55c9802cc7d919f7dd794bd5fea30eSailesh Nepal        return mStatusHints;
769e7ef59a77d55c9802cc7d919f7dd794bd5fea30eSailesh Nepal    }
770e7ef59a77d55c9802cc7d919f7dd794bd5fea30eSailesh Nepal
771e7ef59a77d55c9802cc7d919f7dd794bd5fea30eSailesh Nepal    /**
772542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     * Assign a listener to be notified of state changes.
773542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     *
774542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     * @param l A listener.
775542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     * @return This Connection.
776542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     *
777542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     * @hide
778542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     */
779542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad    public final Connection addConnectionListener(Listener l) {
780d34e5713c9571859d12e9c2e83ce3946cacdd68eSantos Cordon        mListeners.add(l);
781542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad        return this;
782542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad    }
783542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad
784542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad    /**
785542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     * Remove a previously assigned listener that was being notified of state changes.
786542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     *
787542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     * @param l A Listener.
788542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     * @return This Connection.
789542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     *
790542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     * @hide
791542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     */
792542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad    public final Connection removeConnectionListener(Listener l) {
793229e3820dce98f64fd4834d5f421faec9a9d7026Jay Shrauner        if (l != null) {
794229e3820dce98f64fd4834d5f421faec9a9d7026Jay Shrauner            mListeners.remove(l);
795229e3820dce98f64fd4834d5f421faec9a9d7026Jay Shrauner        }
796542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad        return this;
797542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad    }
798542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad
799542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad    /**
800cf7020b7e84c1f5190db7167d70cb0675cd3332fSailesh Nepal     * @return The {@link DisconnectCause} for this connection.
801bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton     */
8027f3d41fd124dd7c4a8b72c1d48df08a8ee7209ecAndrew Lee    public final DisconnectCause getDisconnectCause() {
803cf7020b7e84c1f5190db7167d70cb0675cd3332fSailesh Nepal        return mDisconnectCause;
804bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton    }
805bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton
806bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton    /**
807542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     * Inform this Connection that the state of its audio output has been changed externally.
808542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     *
809542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     * @param state The new audio state.
810400cc48512dc69e940ad4d233a3b47ee9574601dSailesh Nepal     * @hide
811542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     */
812b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad    final void setAudioState(AudioState state) {
8135c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        checkImmutable();
81460ac30bb8a30fa7283d592c12ddf2da9447adf14Ihab Awad        Log.d(this, "setAudioState %s", state);
815b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        mAudioState = state;
816354b2bd0fe8647bd5c7e28f3598b9b7414846124Nancy Chen        onAudioStateChanged(state);
817542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad    }
818542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad
819542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad    /**
820b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad     * @param state An integer value of a {@code STATE_*} constant.
821542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     * @return A string representation of the value.
822542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     */
823542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad    public static String stateToString(int state) {
824542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad        switch (state) {
825b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            case STATE_INITIALIZING:
826b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                return "STATE_INITIALIZING";
827b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            case STATE_NEW:
828b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                return "STATE_NEW";
829b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            case STATE_RINGING:
830b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                return "STATE_RINGING";
831b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            case STATE_DIALING:
832b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                return "STATE_DIALING";
833b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            case STATE_ACTIVE:
834b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                return "STATE_ACTIVE";
835b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            case STATE_HOLDING:
836b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                return "STATE_HOLDING";
837b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            case STATE_DISCONNECTED:
838542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad                return "DISCONNECTED";
839542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad            default:
84060ac30bb8a30fa7283d592c12ddf2da9447adf14Ihab Awad                Log.wtf(Connection.class, "Unknown state %d", state);
841542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad                return "UNKNOWN";
842542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad        }
843542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad    }
844542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad
845542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad    /**
8465c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * Returns the connection's capabilities, as a bit mask of the {@code CAPABILITY_*} constants.
84752a28f619fca8c2118e1f421cb56f6542805e954Ihab Awad     */
8485c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad    public final int getConnectionCapabilities() {
8495c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        return mConnectionCapabilities;
85052a28f619fca8c2118e1f421cb56f6542805e954Ihab Awad    }
85152a28f619fca8c2118e1f421cb56f6542805e954Ihab Awad
852ef77f0ed78db3cfa098a26d6186abbd59c5cfd15Sailesh Nepal    /** @hide */
853ef77f0ed78db3cfa098a26d6186abbd59c5cfd15Sailesh Nepal    @SystemApi @Deprecated public final int getCallCapabilities() {
854ef77f0ed78db3cfa098a26d6186abbd59c5cfd15Sailesh Nepal        return getConnectionCapabilities();
855ef77f0ed78db3cfa098a26d6186abbd59c5cfd15Sailesh Nepal    }
856ef77f0ed78db3cfa098a26d6186abbd59c5cfd15Sailesh Nepal
85752a28f619fca8c2118e1f421cb56f6542805e954Ihab Awad    /**
858100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee     * Sets the value of the {@link #getAddress()} property.
859542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     *
860100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee     * @param address The new address.
861100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee     * @param presentation The presentation requirements for the address.
862ef9f6f957d897ea0ed82114185b8fa3fefd4917bTyler Gunn     *        See {@link TelecomManager} for valid values.
863542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     */
864100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee    public final void setAddress(Uri address, int presentation) {
8655c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        checkImmutable();
866100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee        Log.d(this, "setAddress %s", address);
867100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee        mAddress = address;
868100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee        mAddressPresentation = presentation;
869d34e5713c9571859d12e9c2e83ce3946cacdd68eSantos Cordon        for (Listener l : mListeners) {
870100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee            l.onAddressChanged(this, address, presentation);
871d34e5713c9571859d12e9c2e83ce3946cacdd68eSantos Cordon        }
872542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad    }
873542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad
874542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad    /**
875612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepal     * Sets the caller display name (CNAP).
8762a46b90222e5c9c73de012382a604a71f9c0c30cSailesh Nepal     *
877612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepal     * @param callerDisplayName The new display name.
8789d568c01db1f90fbe9cbff1d9385e7e7b809e066Nancy Chen     * @param presentation The presentation requirements for the handle.
879ef9f6f957d897ea0ed82114185b8fa3fefd4917bTyler Gunn     *        See {@link TelecomManager} for valid values.
880612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepal     */
881612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepal    public final void setCallerDisplayName(String callerDisplayName, int presentation) {
8825c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        checkImmutable();
883612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepal        Log.d(this, "setCallerDisplayName %s", callerDisplayName);
884d34e5713c9571859d12e9c2e83ce3946cacdd68eSantos Cordon        mCallerDisplayName = callerDisplayName;
885d34e5713c9571859d12e9c2e83ce3946cacdd68eSantos Cordon        mCallerDisplayNamePresentation = presentation;
886d34e5713c9571859d12e9c2e83ce3946cacdd68eSantos Cordon        for (Listener l : mListeners) {
887d34e5713c9571859d12e9c2e83ce3946cacdd68eSantos Cordon            l.onCallerDisplayNameChanged(this, callerDisplayName, presentation);
888d34e5713c9571859d12e9c2e83ce3946cacdd68eSantos Cordon        }
8892a46b90222e5c9c73de012382a604a71f9c0c30cSailesh Nepal    }
8902a46b90222e5c9c73de012382a604a71f9c0c30cSailesh Nepal
8912a46b90222e5c9c73de012382a604a71f9c0c30cSailesh Nepal    /**
892aa07df84f279a87ad6370758c9d792a660f2cebbTyler Gunn     * Set the video state for the connection.
893b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad     * Valid values: {@link VideoProfile.VideoState#AUDIO_ONLY},
894b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad     * {@link VideoProfile.VideoState#BIDIRECTIONAL},
895b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad     * {@link VideoProfile.VideoState#TX_ENABLED},
896b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad     * {@link VideoProfile.VideoState#RX_ENABLED}.
897aa07df84f279a87ad6370758c9d792a660f2cebbTyler Gunn     *
898aa07df84f279a87ad6370758c9d792a660f2cebbTyler Gunn     * @param videoState The new video state.
89927d1e257f3cba2d5954e5562db69035df9ecf290Tyler Gunn     * @hide
900aa07df84f279a87ad6370758c9d792a660f2cebbTyler Gunn     */
901aa07df84f279a87ad6370758c9d792a660f2cebbTyler Gunn    public final void setVideoState(int videoState) {
9025c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        checkImmutable();
903aa07df84f279a87ad6370758c9d792a660f2cebbTyler Gunn        Log.d(this, "setVideoState %d", videoState);
904d34e5713c9571859d12e9c2e83ce3946cacdd68eSantos Cordon        mVideoState = videoState;
905d34e5713c9571859d12e9c2e83ce3946cacdd68eSantos Cordon        for (Listener l : mListeners) {
906d34e5713c9571859d12e9c2e83ce3946cacdd68eSantos Cordon            l.onVideoStateChanged(this, mVideoState);
907d34e5713c9571859d12e9c2e83ce3946cacdd68eSantos Cordon        }
908aa07df84f279a87ad6370758c9d792a660f2cebbTyler Gunn    }
909aa07df84f279a87ad6370758c9d792a660f2cebbTyler Gunn
910aa07df84f279a87ad6370758c9d792a660f2cebbTyler Gunn    /**
9115c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * Sets state to active (e.g., an ongoing connection where two or more parties can actively
912542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     * communicate).
913542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     */
914400cc48512dc69e940ad4d233a3b47ee9574601dSailesh Nepal    public final void setActive() {
9155c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        checkImmutable();
916100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee        setRingbackRequested(false);
917b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        setState(STATE_ACTIVE);
918542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad    }
919542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad
920542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad    /**
9215c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * Sets state to ringing (e.g., an inbound ringing connection).
922542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     */
923400cc48512dc69e940ad4d233a3b47ee9574601dSailesh Nepal    public final void setRinging() {
9245c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        checkImmutable();
925b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        setState(STATE_RINGING);
926542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad    }
927542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad
928542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad    /**
929bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton     * Sets state to initializing (this Connection is not yet ready to be used).
930bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton     */
931bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton    public final void setInitializing() {
9325c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        checkImmutable();
933b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        setState(STATE_INITIALIZING);
934bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton    }
935bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton
936bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton    /**
937bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton     * Sets state to initialized (the Connection has been set up and is now ready to be used).
938bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton     */
939bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton    public final void setInitialized() {
9405c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        checkImmutable();
941b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        setState(STATE_NEW);
942bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton    }
943bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton
944bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton    /**
9455c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * Sets state to dialing (e.g., dialing an outbound connection).
946542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     */
947400cc48512dc69e940ad4d233a3b47ee9574601dSailesh Nepal    public final void setDialing() {
9485c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        checkImmutable();
949b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        setState(STATE_DIALING);
950542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad    }
951542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad
952542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad    /**
953542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     * Sets state to be on hold.
954542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     */
955400cc48512dc69e940ad4d233a3b47ee9574601dSailesh Nepal    public final void setOnHold() {
9565c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        checkImmutable();
957b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        setState(STATE_HOLDING);
958542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad    }
959542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad
960542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad    /**
9615c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * Sets the video connection provider.
962b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad     * @param videoProvider The video provider.
96327d1e257f3cba2d5954e5562db69035df9ecf290Tyler Gunn     * @hide
9645ffbe8b850c2703b64617f0140d051a5412dd861Andrew Lee     */
965b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad    public final void setVideoProvider(VideoProvider videoProvider) {
9665c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        checkImmutable();
967b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        mVideoProvider = videoProvider;
968d34e5713c9571859d12e9c2e83ce3946cacdd68eSantos Cordon        for (Listener l : mListeners) {
969b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            l.onVideoProviderChanged(this, videoProvider);
970d34e5713c9571859d12e9c2e83ce3946cacdd68eSantos Cordon        }
9715ffbe8b850c2703b64617f0140d051a5412dd861Andrew Lee    }
9725ffbe8b850c2703b64617f0140d051a5412dd861Andrew Lee
97327d1e257f3cba2d5954e5562db69035df9ecf290Tyler Gunn    /** @hide */
974b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad    public final VideoProvider getVideoProvider() {
975b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        return mVideoProvider;
976a27a1938ab27aeb17144867b231f830622fa6ad4Andrew Lee    }
977a27a1938ab27aeb17144867b231f830622fa6ad4Andrew Lee
9785ffbe8b850c2703b64617f0140d051a5412dd861Andrew Lee    /**
979091768c3021d740b7d66846d36405c4d4c76cc56Sailesh Nepal     * Sets state to disconnected.
980542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     *
9817f3d41fd124dd7c4a8b72c1d48df08a8ee7209ecAndrew Lee     * @param disconnectCause The reason for the disconnection, as specified by
982b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad     *         {@link DisconnectCause}.
983542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     */
9847f3d41fd124dd7c4a8b72c1d48df08a8ee7209ecAndrew Lee    public final void setDisconnected(DisconnectCause disconnectCause) {
9855c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        checkImmutable();
9867f3d41fd124dd7c4a8b72c1d48df08a8ee7209ecAndrew Lee        mDisconnectCause = disconnectCause;
987b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        setState(STATE_DISCONNECTED);
988f34519b4dd12d065c510b06922a196e8a3fd9885mike dooley        Log.d(this, "Disconnected with cause %s", disconnectCause);
989d34e5713c9571859d12e9c2e83ce3946cacdd68eSantos Cordon        for (Listener l : mListeners) {
9907f3d41fd124dd7c4a8b72c1d48df08a8ee7209ecAndrew Lee            l.onDisconnected(this, disconnectCause);
991d34e5713c9571859d12e9c2e83ce3946cacdd68eSantos Cordon        }
992542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad    }
993542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad
994542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad    /**
9955c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * Informs listeners that this {@code Connection} is in a post-dial wait state. This is done
9965c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * when (a) the {@code Connection} is issuing a DTMF sequence; (b) it has encountered a "wait"
9975c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * character; and (c) it wishes to inform the In-Call app that it is waiting for the end-user
9985c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * to send an {@link #onPostDialContinue(boolean)} signal.
9995c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     *
10005c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * @param remaining The DTMF character sequence remaining to be emitted once the
10015c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     *         {@link #onPostDialContinue(boolean)} is received, including any "wait" characters
10025c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     *         that remaining sequence may contain.
1003091768c3021d740b7d66846d36405c4d4c76cc56Sailesh Nepal     */
1004091768c3021d740b7d66846d36405c4d4c76cc56Sailesh Nepal    public final void setPostDialWait(String remaining) {
10055c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        checkImmutable();
1006d34e5713c9571859d12e9c2e83ce3946cacdd68eSantos Cordon        for (Listener l : mListeners) {
1007d34e5713c9571859d12e9c2e83ce3946cacdd68eSantos Cordon            l.onPostDialWait(this, remaining);
1008d34e5713c9571859d12e9c2e83ce3946cacdd68eSantos Cordon        }
1009091768c3021d740b7d66846d36405c4d4c76cc56Sailesh Nepal    }
1010091768c3021d740b7d66846d36405c4d4c76cc56Sailesh Nepal
1011091768c3021d740b7d66846d36405c4d4c76cc56Sailesh Nepal    /**
101227d1c2d148fe377ca0d2744f0f85789a42c8f808Nancy Chen     * Informs listeners that this {@code Connection} has processed a character in the post-dial
101327d1c2d148fe377ca0d2744f0f85789a42c8f808Nancy Chen     * started state. This is done when (a) the {@code Connection} is issuing a DTMF sequence;
101427d1c2d148fe377ca0d2744f0f85789a42c8f808Nancy Chen     * (b) it has encountered a "wait" character; and (c) it wishes to signal Telecom to play
101527d1c2d148fe377ca0d2744f0f85789a42c8f808Nancy Chen     * the corresponding DTMF tone locally.
101627d1c2d148fe377ca0d2744f0f85789a42c8f808Nancy Chen     *
101727d1c2d148fe377ca0d2744f0f85789a42c8f808Nancy Chen     * @param nextChar The DTMF character that was just processed by the {@code Connection}.
101827d1c2d148fe377ca0d2744f0f85789a42c8f808Nancy Chen     *
101927d1c2d148fe377ca0d2744f0f85789a42c8f808Nancy Chen     * @hide
102027d1c2d148fe377ca0d2744f0f85789a42c8f808Nancy Chen     */
102127d1c2d148fe377ca0d2744f0f85789a42c8f808Nancy Chen    public final void setNextPostDialWaitChar(char nextChar) {
102227d1c2d148fe377ca0d2744f0f85789a42c8f808Nancy Chen        checkImmutable();
102327d1c2d148fe377ca0d2744f0f85789a42c8f808Nancy Chen        for (Listener l : mListeners) {
102427d1c2d148fe377ca0d2744f0f85789a42c8f808Nancy Chen            l.onPostDialChar(this, nextChar);
102527d1c2d148fe377ca0d2744f0f85789a42c8f808Nancy Chen        }
102627d1c2d148fe377ca0d2744f0f85789a42c8f808Nancy Chen    }
102727d1c2d148fe377ca0d2744f0f85789a42c8f808Nancy Chen
102827d1c2d148fe377ca0d2744f0f85789a42c8f808Nancy Chen    /**
1029f835897f9f799490de27653ae39141ba6bc14223Ihab Awad     * Requests that the framework play a ringback tone. This is to be invoked by implementations
10305c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * that do not play a ringback tone themselves in the connection's audio stream.
1031f835897f9f799490de27653ae39141ba6bc14223Ihab Awad     *
1032f835897f9f799490de27653ae39141ba6bc14223Ihab Awad     * @param ringback Whether the ringback tone is to be played.
1033f835897f9f799490de27653ae39141ba6bc14223Ihab Awad     */
1034100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee    public final void setRingbackRequested(boolean ringback) {
10355c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        checkImmutable();
1036100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee        if (mRingbackRequested != ringback) {
1037100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee            mRingbackRequested = ringback;
1038d34e5713c9571859d12e9c2e83ce3946cacdd68eSantos Cordon            for (Listener l : mListeners) {
1039100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee                l.onRingbackRequested(this, ringback);
1040d34e5713c9571859d12e9c2e83ce3946cacdd68eSantos Cordon            }
1041d34e5713c9571859d12e9c2e83ce3946cacdd68eSantos Cordon        }
1042f835897f9f799490de27653ae39141ba6bc14223Ihab Awad    }
1043f835897f9f799490de27653ae39141ba6bc14223Ihab Awad
10445c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad    /** @hide */
1045de06133569bb80bcfc182dd31d2348f006b79ff5Ihab Awad    @SystemApi @Deprecated public final void setCallCapabilities(int connectionCapabilities) {
10465c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        setConnectionCapabilities(connectionCapabilities);
10475c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad    }
10485c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad
1049f835897f9f799490de27653ae39141ba6bc14223Ihab Awad    /**
10505c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * Sets the connection's capabilities as a bit mask of the {@code CAPABILITY_*} constants.
10511a7061ba950538c93d92c0448752a212039cc06aSailesh Nepal     *
10525c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * @param connectionCapabilities The new connection capabilities.
1053b693998fdfdd4498a33c4c69405f2708e4840aa7Santos Cordon     */
10545c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad    public final void setConnectionCapabilities(int connectionCapabilities) {
10555c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        checkImmutable();
10565c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        if (mConnectionCapabilities != connectionCapabilities) {
10575c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad            mConnectionCapabilities = connectionCapabilities;
1058d34e5713c9571859d12e9c2e83ce3946cacdd68eSantos Cordon            for (Listener l : mListeners) {
10595c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad                l.onConnectionCapabilitiesChanged(this, mConnectionCapabilities);
1060d34e5713c9571859d12e9c2e83ce3946cacdd68eSantos Cordon            }
1061d34e5713c9571859d12e9c2e83ce3946cacdd68eSantos Cordon        }
1062b693998fdfdd4498a33c4c69405f2708e4840aa7Santos Cordon    }
1063b693998fdfdd4498a33c4c69405f2708e4840aa7Santos Cordon
1064b693998fdfdd4498a33c4c69405f2708e4840aa7Santos Cordon    /**
10657c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon     * Tears down the Connection object.
1066b693998fdfdd4498a33c4c69405f2708e4840aa7Santos Cordon     */
106736a713431ceda2e5462c5dc5d1300f32acf9e63aEvan Charlton    public final void destroy() {
1068229e3820dce98f64fd4834d5f421faec9a9d7026Jay Shrauner        for (Listener l : mListeners) {
1069229e3820dce98f64fd4834d5f421faec9a9d7026Jay Shrauner            l.onDestroyed(this);
1070d34e5713c9571859d12e9c2e83ce3946cacdd68eSantos Cordon        }
1071b693998fdfdd4498a33c4c69405f2708e4840aa7Santos Cordon    }
1072b693998fdfdd4498a33c4c69405f2708e4840aa7Santos Cordon
1073b693998fdfdd4498a33c4c69405f2708e4840aa7Santos Cordon    /**
107433aaae4a07fdcce223fe74d96d751f4bffa6723aSailesh Nepal     * Requests that the framework use VOIP audio mode for this connection.
107533aaae4a07fdcce223fe74d96d751f4bffa6723aSailesh Nepal     *
107633aaae4a07fdcce223fe74d96d751f4bffa6723aSailesh Nepal     * @param isVoip True if the audio mode is VOIP.
107733aaae4a07fdcce223fe74d96d751f4bffa6723aSailesh Nepal     */
107833aaae4a07fdcce223fe74d96d751f4bffa6723aSailesh Nepal    public final void setAudioModeIsVoip(boolean isVoip) {
10795c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        checkImmutable();
1080d34e5713c9571859d12e9c2e83ce3946cacdd68eSantos Cordon        mAudioModeIsVoip = isVoip;
1081d34e5713c9571859d12e9c2e83ce3946cacdd68eSantos Cordon        for (Listener l : mListeners) {
1082d34e5713c9571859d12e9c2e83ce3946cacdd68eSantos Cordon            l.onAudioModeIsVoipChanged(this, isVoip);
1083d34e5713c9571859d12e9c2e83ce3946cacdd68eSantos Cordon        }
108433aaae4a07fdcce223fe74d96d751f4bffa6723aSailesh Nepal    }
108533aaae4a07fdcce223fe74d96d751f4bffa6723aSailesh Nepal
108633aaae4a07fdcce223fe74d96d751f4bffa6723aSailesh Nepal    /**
1087e7ef59a77d55c9802cc7d919f7dd794bd5fea30eSailesh Nepal     * Sets the label and icon status to display in the in-call UI.
1088e7ef59a77d55c9802cc7d919f7dd794bd5fea30eSailesh Nepal     *
1089e7ef59a77d55c9802cc7d919f7dd794bd5fea30eSailesh Nepal     * @param statusHints The status label and icon to set.
1090e7ef59a77d55c9802cc7d919f7dd794bd5fea30eSailesh Nepal     */
1091e7ef59a77d55c9802cc7d919f7dd794bd5fea30eSailesh Nepal    public final void setStatusHints(StatusHints statusHints) {
10925c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        checkImmutable();
1093d34e5713c9571859d12e9c2e83ce3946cacdd68eSantos Cordon        mStatusHints = statusHints;
1094d34e5713c9571859d12e9c2e83ce3946cacdd68eSantos Cordon        for (Listener l : mListeners) {
1095d34e5713c9571859d12e9c2e83ce3946cacdd68eSantos Cordon            l.onStatusHintsChanged(this, statusHints);
1096d34e5713c9571859d12e9c2e83ce3946cacdd68eSantos Cordon        }
1097e7ef59a77d55c9802cc7d919f7dd794bd5fea30eSailesh Nepal    }
1098e7ef59a77d55c9802cc7d919f7dd794bd5fea30eSailesh Nepal
1099e7ef59a77d55c9802cc7d919f7dd794bd5fea30eSailesh Nepal    /**
11007c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon     * Sets the connections with which this connection can be conferenced.
11017c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon     *
11027c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon     * @param conferenceableConnections The set of connections this connection can conference with.
11037c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon     */
11047c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon    public final void setConferenceableConnections(List<Connection> conferenceableConnections) {
11055c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        checkImmutable();
11067c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon        clearConferenceableList();
11077c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon        for (Connection c : conferenceableConnections) {
11087c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon            // If statement checks for duplicates in input. It makes it N^2 but we're dealing with a
11097c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon            // small amount of items here.
11106d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn            if (!mConferenceables.contains(c)) {
11117c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon                c.addConnectionListener(mConnectionDeathListener);
11126d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn                mConferenceables.add(c);
11137c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon            }
11147c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon        }
11157c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon        fireOnConferenceableConnectionsChanged();
11167c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon    }
11177c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon
11187c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon    /**
11196d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn     * Similar to {@link #setConferenceableConnections(java.util.List)}, sets a list of connections
11206d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn     * or conferences with which this connection can be conferenced.
11216d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn     *
11226d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn     * @param conferenceables The conferenceables.
1123b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad     */
11246d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn    public final void setConferenceables(List<IConferenceable> conferenceables) {
11256d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn        clearConferenceableList();
11266d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn        for (IConferenceable c : conferenceables) {
11276d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn            // If statement checks for duplicates in input. It makes it N^2 but we're dealing with a
11286d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn            // small amount of items here.
11296d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn            if (!mConferenceables.contains(c)) {
11306d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn                if (c instanceof Connection) {
11316d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn                    Connection connection = (Connection) c;
11326d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn                    connection.addConnectionListener(mConnectionDeathListener);
11336d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn                } else if (c instanceof Conference) {
11346d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn                    Conference conference = (Conference) c;
11356d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn                    conference.addListener(mConferenceDeathListener);
11366d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn                }
11376d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn                mConferenceables.add(c);
11386d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn            }
11396d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn        }
11406d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn        fireOnConferenceableConnectionsChanged();
11416d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn    }
11426d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn
11436d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn    /**
11446d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn     * Returns the connections or conferences with which this connection can be conferenced.
11456d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn     */
11466d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn    public final List<IConferenceable> getConferenceables() {
11476d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn        return mUnmodifiableConferenceables;
1148b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad    }
1149b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
11508635c578f0408ca76cbaef5464d27bfde7450425Evan Charlton    /*
1151823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon     * @hide
1152823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon     */
1153823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon    public final void setConnectionService(ConnectionService connectionService) {
11545c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        checkImmutable();
1155823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon        if (mConnectionService != null) {
1156823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon            Log.e(this, new Exception(), "Trying to set ConnectionService on a connection " +
1157823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon                    "which is already associated with another ConnectionService.");
1158823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon        } else {
1159823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon            mConnectionService = connectionService;
1160823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon        }
1161823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon    }
1162823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon
1163823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon    /**
1164823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon     * @hide
1165823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon     */
1166823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon    public final void unsetConnectionService(ConnectionService connectionService) {
1167823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon        if (mConnectionService != connectionService) {
1168823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon            Log.e(this, new Exception(), "Trying to remove ConnectionService from a Connection " +
1169823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon                    "that does not belong to the ConnectionService.");
1170823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon        } else {
1171823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon            mConnectionService = null;
1172823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon        }
1173823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon    }
1174823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon
1175823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon    /**
1176af1b296a41f0b6e3af34e9c2c73bc1029bfa8b2aSantos Cordon     * @hide
1177af1b296a41f0b6e3af34e9c2c73bc1029bfa8b2aSantos Cordon     */
1178af1b296a41f0b6e3af34e9c2c73bc1029bfa8b2aSantos Cordon    public final ConnectionService getConnectionService() {
1179af1b296a41f0b6e3af34e9c2c73bc1029bfa8b2aSantos Cordon        return mConnectionService;
1180af1b296a41f0b6e3af34e9c2c73bc1029bfa8b2aSantos Cordon    }
1181af1b296a41f0b6e3af34e9c2c73bc1029bfa8b2aSantos Cordon
1182af1b296a41f0b6e3af34e9c2c73bc1029bfa8b2aSantos Cordon    /**
1183823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon     * Sets the conference that this connection is a part of. This will fail if the connection is
11845c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * already part of a conference. {@link #resetConference} to un-set the conference first.
1185823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon     *
1186823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon     * @param conference The conference.
1187823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon     * @return {@code true} if the conference was successfully set.
1188823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon     * @hide
1189823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon     */
1190823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon    public final boolean setConference(Conference conference) {
11915c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        checkImmutable();
1192823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon        // We check to see if it is already part of another conference.
11930159ac0cfe20e8f85ee4150e64d91392850f8a3fSantos Cordon        if (mConference == null) {
1194823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon            mConference = conference;
11950159ac0cfe20e8f85ee4150e64d91392850f8a3fSantos Cordon            if (mConnectionService != null && mConnectionService.containsConference(conference)) {
11960159ac0cfe20e8f85ee4150e64d91392850f8a3fSantos Cordon                fireConferenceChanged();
11970159ac0cfe20e8f85ee4150e64d91392850f8a3fSantos Cordon            }
1198823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon            return true;
1199823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon        }
1200823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon        return false;
1201823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon    }
1202823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon
1203823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon    /**
1204823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon     * Resets the conference that this connection is a part of.
1205823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon     * @hide
1206823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon     */
1207823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon    public final void resetConference() {
1208823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon        if (mConference != null) {
12090159ac0cfe20e8f85ee4150e64d91392850f8a3fSantos Cordon            Log.d(this, "Conference reset");
1210823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon            mConference = null;
1211823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon            fireConferenceChanged();
1212823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon        }
1213823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon    }
1214823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon
1215b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad    /**
1216b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad     * Notifies this Connection that the {@link #getAudioState()} property has a new value.
1217400cc48512dc69e940ad4d233a3b47ee9574601dSailesh Nepal     *
12185c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * @param state The new connection audio state.
1219400cc48512dc69e940ad4d233a3b47ee9574601dSailesh Nepal     */
1220354b2bd0fe8647bd5c7e28f3598b9b7414846124Nancy Chen    public void onAudioStateChanged(AudioState state) {}
1221400cc48512dc69e940ad4d233a3b47ee9574601dSailesh Nepal
1222400cc48512dc69e940ad4d233a3b47ee9574601dSailesh Nepal    /**
1223bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton     * Notifies this Connection of an internal state change. This method is called after the
1224bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton     * state is changed.
1225f835897f9f799490de27653ae39141ba6bc14223Ihab Awad     *
1226b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad     * @param state The new state, one of the {@code STATE_*} constants.
1227f835897f9f799490de27653ae39141ba6bc14223Ihab Awad     */
1228354b2bd0fe8647bd5c7e28f3598b9b7414846124Nancy Chen    public void onStateChanged(int state) {}
1229f835897f9f799490de27653ae39141ba6bc14223Ihab Awad
1230f835897f9f799490de27653ae39141ba6bc14223Ihab Awad    /**
1231542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     * Notifies this Connection of a request to play a DTMF tone.
1232542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     *
1233542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     * @param c A DTMF character.
1234542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     */
1235f29511043e1c3bf750e28427410192c793363bf7Santos Cordon    public void onPlayDtmfTone(char c) {}
1236542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad
1237542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad    /**
1238542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     * Notifies this Connection of a request to stop any currently playing DTMF tones.
1239542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     */
1240f29511043e1c3bf750e28427410192c793363bf7Santos Cordon    public void onStopDtmfTone() {}
1241542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad
1242542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad    /**
1243542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     * Notifies this Connection of a request to disconnect.
1244542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     */
1245f29511043e1c3bf750e28427410192c793363bf7Santos Cordon    public void onDisconnect() {}
1246542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad
1247542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad    /**
12483b4b1dcb607b8932374a4bc8c9ab349b9bb68660Tyler Gunn     * Notifies this Connection of a request to disconnect a participant of the conference managed
12493b4b1dcb607b8932374a4bc8c9ab349b9bb68660Tyler Gunn     * by the connection.
12503b4b1dcb607b8932374a4bc8c9ab349b9bb68660Tyler Gunn     *
12513b4b1dcb607b8932374a4bc8c9ab349b9bb68660Tyler Gunn     * @param endpoint the {@link Uri} of the participant to disconnect.
12523b4b1dcb607b8932374a4bc8c9ab349b9bb68660Tyler Gunn     * @hide
12533b4b1dcb607b8932374a4bc8c9ab349b9bb68660Tyler Gunn     */
12543b4b1dcb607b8932374a4bc8c9ab349b9bb68660Tyler Gunn    public void onDisconnectConferenceParticipant(Uri endpoint) {}
12553b4b1dcb607b8932374a4bc8c9ab349b9bb68660Tyler Gunn
12563b4b1dcb607b8932374a4bc8c9ab349b9bb68660Tyler Gunn    /**
12577c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon     * Notifies this Connection of a request to separate from its parent conference.
1258b693998fdfdd4498a33c4c69405f2708e4840aa7Santos Cordon     */
1259f29511043e1c3bf750e28427410192c793363bf7Santos Cordon    public void onSeparate() {}
1260b693998fdfdd4498a33c4c69405f2708e4840aa7Santos Cordon
1261b693998fdfdd4498a33c4c69405f2708e4840aa7Santos Cordon    /**
1262542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     * Notifies this Connection of a request to abort.
1263542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     */
1264f29511043e1c3bf750e28427410192c793363bf7Santos Cordon    public void onAbort() {}
1265542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad
1266542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad    /**
1267542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     * Notifies this Connection of a request to hold.
1268542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     */
1269f29511043e1c3bf750e28427410192c793363bf7Santos Cordon    public void onHold() {}
1270542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad
1271542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad    /**
1272542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     * Notifies this Connection of a request to exit a hold state.
1273542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     */
1274f29511043e1c3bf750e28427410192c793363bf7Santos Cordon    public void onUnhold() {}
1275542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad
1276542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad    /**
1277b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad     * Notifies this Connection, which is in {@link #STATE_RINGING}, of
1278d34e5713c9571859d12e9c2e83ce3946cacdd68eSantos Cordon     * a request to accept.
12798da4c3c11faf066b2b04ba853f03be6f1c4af5d8Andrew Lee     *
12805c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * @param videoState The video state in which to answer the connection.
1281be74de0978a7eaa577f6b61902b550a3161aff8bTyler Gunn     * @hide
1282542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     */
1283f29511043e1c3bf750e28427410192c793363bf7Santos Cordon    public void onAnswer(int videoState) {}
1284542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad
1285542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad    /**
1286b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad     * Notifies this Connection, which is in {@link #STATE_RINGING}, of
1287be74de0978a7eaa577f6b61902b550a3161aff8bTyler Gunn     * a request to accept.
1288be74de0978a7eaa577f6b61902b550a3161aff8bTyler Gunn     */
1289be74de0978a7eaa577f6b61902b550a3161aff8bTyler Gunn    public void onAnswer() {
1290be74de0978a7eaa577f6b61902b550a3161aff8bTyler Gunn        onAnswer(VideoProfile.VideoState.AUDIO_ONLY);
1291be74de0978a7eaa577f6b61902b550a3161aff8bTyler Gunn    }
1292be74de0978a7eaa577f6b61902b550a3161aff8bTyler Gunn
1293be74de0978a7eaa577f6b61902b550a3161aff8bTyler Gunn    /**
1294be74de0978a7eaa577f6b61902b550a3161aff8bTyler Gunn     * Notifies this Connection, which is in {@link #STATE_RINGING}, of
1295d34e5713c9571859d12e9c2e83ce3946cacdd68eSantos Cordon     * a request to reject.
1296542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     */
1297f29511043e1c3bf750e28427410192c793363bf7Santos Cordon    public void onReject() {}
1298542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad
12996dea4aceba8f69ee4be346ec356d277a3c153f3dEvan Charlton    /**
13006dea4aceba8f69ee4be346ec356d277a3c153f3dEvan Charlton     * Notifies this Connection whether the user wishes to proceed with the post-dial DTMF codes.
13016dea4aceba8f69ee4be346ec356d277a3c153f3dEvan Charlton     */
1302f29511043e1c3bf750e28427410192c793363bf7Santos Cordon    public void onPostDialContinue(boolean proceed) {}
13036dea4aceba8f69ee4be346ec356d277a3c153f3dEvan Charlton
1304b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad    static String toLogSafePhoneNumber(String number) {
1305b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        // For unknown number, log empty string.
1306b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        if (number == null) {
1307b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            return "";
1308b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        }
1309b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
1310b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        if (PII_DEBUG) {
1311b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            // When PII_DEBUG is true we emit PII.
1312b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            return number;
1313b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        }
1314b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
1315b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        // Do exactly same thing as Uri#toSafeString() does, which will enable us to compare
1316b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        // sanitized phone numbers.
1317b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        StringBuilder builder = new StringBuilder();
1318b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        for (int i = 0; i < number.length(); i++) {
1319b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            char c = number.charAt(i);
1320b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            if (c == '-' || c == '@' || c == '.') {
1321b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                builder.append(c);
1322b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            } else {
1323b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                builder.append('x');
1324b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            }
1325b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        }
1326b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        return builder.toString();
1327b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad    }
1328b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
1329542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad    private void setState(int state) {
13305c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        checkImmutable();
13316107bab041fb7d851fbf865b7310d294aae970c8Ihab Awad        if (mState == STATE_DISCONNECTED && mState != state) {
13326107bab041fb7d851fbf865b7310d294aae970c8Ihab Awad            Log.d(this, "Connection already DISCONNECTED; cannot transition out of this state.");
1333bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton            return;
1334400cc48512dc69e940ad4d233a3b47ee9574601dSailesh Nepal        }
1335bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton        if (mState != state) {
1336bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton            Log.d(this, "setState: %s", stateToString(state));
1337bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton            mState = state;
1338354b2bd0fe8647bd5c7e28f3598b9b7414846124Nancy Chen            onStateChanged(state);
1339bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton            for (Listener l : mListeners) {
1340bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton                l.onStateChanged(this, state);
1341bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton            }
1342bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton        }
1343bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton    }
1344bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton
1345cf7020b7e84c1f5190db7167d70cb0675cd3332fSailesh Nepal    private static class FailureSignalingConnection extends Connection {
134690e34e324cbe22f18680809cbc33caf63b320cb4Ihab Awad        private boolean mImmutable = false;
13477f3d41fd124dd7c4a8b72c1d48df08a8ee7209ecAndrew Lee        public FailureSignalingConnection(DisconnectCause disconnectCause) {
13487f3d41fd124dd7c4a8b72c1d48df08a8ee7209ecAndrew Lee            setDisconnected(disconnectCause);
134990e34e324cbe22f18680809cbc33caf63b320cb4Ihab Awad            mImmutable = true;
13506107bab041fb7d851fbf865b7310d294aae970c8Ihab Awad        }
13515c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad
13525c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        public void checkImmutable() {
135390e34e324cbe22f18680809cbc33caf63b320cb4Ihab Awad            if (mImmutable) {
135490e34e324cbe22f18680809cbc33caf63b320cb4Ihab Awad                throw new UnsupportedOperationException("Connection is immutable");
135590e34e324cbe22f18680809cbc33caf63b320cb4Ihab Awad            }
13565c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        }
13576107bab041fb7d851fbf865b7310d294aae970c8Ihab Awad    }
13586107bab041fb7d851fbf865b7310d294aae970c8Ihab Awad
1359bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton    /**
13606107bab041fb7d851fbf865b7310d294aae970c8Ihab Awad     * Return a {@code Connection} which represents a failed connection attempt. The returned
13617f3d41fd124dd7c4a8b72c1d48df08a8ee7209ecAndrew Lee     * {@code Connection} will have a {@link android.telecom.DisconnectCause} and as specified,
13627f3d41fd124dd7c4a8b72c1d48df08a8ee7209ecAndrew Lee     * and a {@link #getState()} of {@link #STATE_DISCONNECTED}.
13636107bab041fb7d851fbf865b7310d294aae970c8Ihab Awad     * <p>
13646107bab041fb7d851fbf865b7310d294aae970c8Ihab Awad     * The returned {@code Connection} can be assumed to {@link #destroy()} itself when appropriate,
13656107bab041fb7d851fbf865b7310d294aae970c8Ihab Awad     * so users of this method need not maintain a reference to its return value to destroy it.
1366bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton     *
13677f3d41fd124dd7c4a8b72c1d48df08a8ee7209ecAndrew Lee     * @param disconnectCause The disconnect cause, ({@see android.telecomm.DisconnectCause}).
13686107bab041fb7d851fbf865b7310d294aae970c8Ihab Awad     * @return A {@code Connection} which indicates failure.
1369bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton     */
13707f3d41fd124dd7c4a8b72c1d48df08a8ee7209ecAndrew Lee    public static Connection createFailedConnection(DisconnectCause disconnectCause) {
13717f3d41fd124dd7c4a8b72c1d48df08a8ee7209ecAndrew Lee        return new FailureSignalingConnection(disconnectCause);
1372bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton    }
1373bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton
1374bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton    /**
13755c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * Override to throw an {@link UnsupportedOperationException} if this {@code Connection} is
13765c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * not intended to be mutated, e.g., if it is a marker for failure. Only for framework use;
13775c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * this should never be un-@hide-den.
13785c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     *
13795c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * @hide
13805c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     */
13815c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad    public void checkImmutable() {}
13825c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad
13835c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad    /**
13846107bab041fb7d851fbf865b7310d294aae970c8Ihab Awad     * Return a {@code Connection} which represents a canceled connection attempt. The returned
13856107bab041fb7d851fbf865b7310d294aae970c8Ihab Awad     * {@code Connection} will have state {@link #STATE_DISCONNECTED}, and cannot be moved out of
13866107bab041fb7d851fbf865b7310d294aae970c8Ihab Awad     * that state. This connection should not be used for anything, and no other
13876107bab041fb7d851fbf865b7310d294aae970c8Ihab Awad     * {@code Connection}s should be attempted.
13886107bab041fb7d851fbf865b7310d294aae970c8Ihab Awad     * <p>
13896107bab041fb7d851fbf865b7310d294aae970c8Ihab Awad     * so users of this method need not maintain a reference to its return value to destroy it.
1390bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton     *
13915c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * @return A {@code Connection} which indicates that the underlying connection should
13925c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * be canceled.
1393bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton     */
1394b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad    public static Connection createCanceledConnection() {
13957f3d41fd124dd7c4a8b72c1d48df08a8ee7209ecAndrew Lee        return new FailureSignalingConnection(new DisconnectCause(DisconnectCause.CANCELED));
1396542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad    }
13977c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon
13985c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad    private final void fireOnConferenceableConnectionsChanged() {
13997c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon        for (Listener l : mListeners) {
14006d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn            l.onConferenceablesChanged(this, getConferenceables());
14017c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon        }
14027c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon    }
14037c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon
1404823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon    private final void fireConferenceChanged() {
1405823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon        for (Listener l : mListeners) {
1406823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon            l.onConferenceChanged(this, mConference);
1407823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon        }
1408823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon    }
1409823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon
14107c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon    private final void clearConferenceableList() {
14116d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn        for (IConferenceable c : mConferenceables) {
14126d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn            if (c instanceof Connection) {
14136d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn                Connection connection = (Connection) c;
14146d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn                connection.removeConnectionListener(mConnectionDeathListener);
14156d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn            } else if (c instanceof Conference) {
14166d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn                Conference conference = (Conference) c;
14176d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn                conference.removeListener(mConferenceDeathListener);
14186d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn            }
14197c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon        }
14206d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn        mConferenceables.clear();
14217c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon    }
14223bffcf78b5e4bd8b60543126fc0bdb09808f28f5Tyler Gunn
14233bffcf78b5e4bd8b60543126fc0bdb09808f28f5Tyler Gunn    /**
1424ab4650c4563cd46e65ac37f924fee8febfd759c6Tyler Gunn     * Notifies listeners of a change to conference participant(s).
14253bffcf78b5e4bd8b60543126fc0bdb09808f28f5Tyler Gunn     *
1426ab4650c4563cd46e65ac37f924fee8febfd759c6Tyler Gunn     * @param conferenceParticipants The participants.
14273bffcf78b5e4bd8b60543126fc0bdb09808f28f5Tyler Gunn     * @hide
14283bffcf78b5e4bd8b60543126fc0bdb09808f28f5Tyler Gunn     */
1429ab4650c4563cd46e65ac37f924fee8febfd759c6Tyler Gunn    protected final void updateConferenceParticipants(
1430ab4650c4563cd46e65ac37f924fee8febfd759c6Tyler Gunn            List<ConferenceParticipant> conferenceParticipants) {
14313bffcf78b5e4bd8b60543126fc0bdb09808f28f5Tyler Gunn        for (Listener l : mListeners) {
1432ab4650c4563cd46e65ac37f924fee8febfd759c6Tyler Gunn            l.onConferenceParticipantsChanged(this, conferenceParticipants);
14333bffcf78b5e4bd8b60543126fc0bdb09808f28f5Tyler Gunn        }
14343bffcf78b5e4bd8b60543126fc0bdb09808f28f5Tyler Gunn    }
14358a2b1199a6db0c6f2493e96e25ec1d89e3f62769Tyler Gunn
14368a2b1199a6db0c6f2493e96e25ec1d89e3f62769Tyler Gunn    /**
14378a2b1199a6db0c6f2493e96e25ec1d89e3f62769Tyler Gunn     * Notifies listeners that a conference call has been started.
14388a2b1199a6db0c6f2493e96e25ec1d89e3f62769Tyler Gunn     */
14398a2b1199a6db0c6f2493e96e25ec1d89e3f62769Tyler Gunn    protected void notifyConferenceStarted() {
14408a2b1199a6db0c6f2493e96e25ec1d89e3f62769Tyler Gunn        for (Listener l : mListeners) {
14418a2b1199a6db0c6f2493e96e25ec1d89e3f62769Tyler Gunn            l.onConferenceStarted();
14428a2b1199a6db0c6f2493e96e25ec1d89e3f62769Tyler Gunn        }
14438a2b1199a6db0c6f2493e96e25ec1d89e3f62769Tyler Gunn    }
1444542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad}
1445