Connection.java revision 1a8ae3e7306b5094f36252e3315fddeaf8b952bc
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    /**
1271a8ae3e7306b5094f36252e3315fddeaf8b952bcAndrew Lee     * Connection is using WIFI.
1285c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * @hide
1295c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     */
1301a8ae3e7306b5094f36252e3315fddeaf8b952bcAndrew Lee    public static final int CAPABILITY_WIFI = 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
150b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad    // Flag controlling whether PII is emitted into the logs
151b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad    private static final boolean PII_DEBUG = Log.isLoggable(android.util.Log.DEBUG);
152b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
1535c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad    /**
1545c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * Whether the given capabilities support the specified capability.
1555c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     *
1565c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * @param capabilities A capability bit field.
1575c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * @param capability The capability to check capabilities for.
1585c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * @return Whether the specified capability is supported.
1595c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * @hide
1605c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     */
1615c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad    public static boolean can(int capabilities, int capability) {
1625c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        return (capabilities & capability) != 0;
1635c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad    }
1645c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad
1655c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad    /**
1665c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * Whether the capabilities of this {@code Connection} supports the specified capability.
1675c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     *
1685c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * @param capability The capability to check capabilities for.
1695c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * @return Whether the specified capability is supported.
1705c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * @hide
1715c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     */
1725c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad    public boolean can(int capability) {
1735c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        return can(mConnectionCapabilities, capability);
1745c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad    }
1755c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad
1765c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad    /**
1775c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * Removes the specified capability from the set of capabilities of this {@code Connection}.
1785c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     *
1795c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * @param capability The capability to remove from the set.
1805c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * @hide
1815c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     */
1825c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad    public void removeCapability(int capability) {
1835c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        mConnectionCapabilities &= ~capability;
1845c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad    }
1855c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad
1865c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad    /**
1875c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * Adds the specified capability to the set of capabilities of this {@code Connection}.
1885c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     *
1895c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * @param capability The capability to add to the set.
1905c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * @hide
1915c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     */
1925c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad    public void addCapability(int capability) {
1935c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        mConnectionCapabilities |= capability;
1945c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad    }
1955c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad
1965c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad
1975c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad    public static String capabilitiesToString(int capabilities) {
1985c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        StringBuilder builder = new StringBuilder();
1995c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        builder.append("[Capabilities:");
2005c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        if (can(capabilities, CAPABILITY_HOLD)) {
2015c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad            builder.append(" CAPABILITY_HOLD");
2025c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        }
2035c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        if (can(capabilities, CAPABILITY_SUPPORT_HOLD)) {
2045c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad            builder.append(" CAPABILITY_SUPPORT_HOLD");
2055c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        }
2065c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        if (can(capabilities, CAPABILITY_MERGE_CONFERENCE)) {
2075c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad            builder.append(" CAPABILITY_MERGE_CONFERENCE");
2085c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        }
2095c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        if (can(capabilities, CAPABILITY_SWAP_CONFERENCE)) {
2105c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad            builder.append(" CAPABILITY_SWAP_CONFERENCE");
2115c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        }
2125c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        if (can(capabilities, CAPABILITY_RESPOND_VIA_TEXT)) {
2135c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad            builder.append(" CAPABILITY_RESPOND_VIA_TEXT");
2145c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        }
2155c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        if (can(capabilities, CAPABILITY_MUTE)) {
2165c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad            builder.append(" CAPABILITY_MUTE");
2175c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        }
2185c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        if (can(capabilities, CAPABILITY_MANAGE_CONFERENCE)) {
2195c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad            builder.append(" CAPABILITY_MANAGE_CONFERENCE");
2205c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        }
2215c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        if (can(capabilities, CAPABILITY_SUPPORTS_VT_LOCAL)) {
2225c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad            builder.append(" CAPABILITY_SUPPORTS_VT_LOCAL");
2235c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        }
2245c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        if (can(capabilities, CAPABILITY_SUPPORTS_VT_REMOTE)) {
2255c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad            builder.append(" CAPABILITY_SUPPORTS_VT_REMOTE");
2265c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        }
22780fff3c0a5f68d4b426a35468daeaf4ff4d3d375Andrew Lee        if (can(capabilities, CAPABILITY_HIGH_DEF_AUDIO)) {
22880fff3c0a5f68d4b426a35468daeaf4ff4d3d375Andrew Lee            builder.append(" CAPABILITY_HIGH_DEF_AUDIO");
2295c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        }
2301a8ae3e7306b5094f36252e3315fddeaf8b952bcAndrew Lee        if (can(capabilities, CAPABILITY_WIFI)) {
2311a8ae3e7306b5094f36252e3315fddeaf8b952bcAndrew Lee            builder.append(" CAPABILITY_WIFI");
2325c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        }
2335c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        if (can(capabilities, CAPABILITY_GENERIC_CONFERENCE)) {
2345c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad            builder.append(" CAPABILITY_GENERIC_CONFERENCE");
2355c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        }
2365c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        builder.append("]");
2375c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        return builder.toString();
2385c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad    }
2395c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad
240091768c3021d740b7d66846d36405c4d4c76cc56Sailesh Nepal    /** @hide */
241612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepal    public abstract static class Listener {
242542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad        public void onStateChanged(Connection c, int state) {}
243100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee        public void onAddressChanged(Connection c, Uri newAddress, int presentation) {}
244612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepal        public void onCallerDisplayNameChanged(
245612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepal                Connection c, String callerDisplayName, int presentation) {}
246aa07df84f279a87ad6370758c9d792a660f2cebbTyler Gunn        public void onVideoStateChanged(Connection c, int videoState) {}
2477f3d41fd124dd7c4a8b72c1d48df08a8ee7209ecAndrew Lee        public void onDisconnected(Connection c, DisconnectCause disconnectCause) {}
248091768c3021d740b7d66846d36405c4d4c76cc56Sailesh Nepal        public void onPostDialWait(Connection c, String remaining) {}
24927d1c2d148fe377ca0d2744f0f85789a42c8f808Nancy Chen        public void onPostDialChar(Connection c, char nextChar) {}
250100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee        public void onRingbackRequested(Connection c, boolean ringback) {}
251612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepal        public void onDestroyed(Connection c) {}
2525c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        public void onConnectionCapabilitiesChanged(Connection c, int capabilities) {}
253b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        public void onVideoProviderChanged(
254b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                Connection c, VideoProvider videoProvider) {}
255001bbbb239d4ef1005a87039c7c53e26d8f13ad6Sailesh Nepal        public void onAudioModeIsVoipChanged(Connection c, boolean isVoip) {}
256001bbbb239d4ef1005a87039c7c53e26d8f13ad6Sailesh Nepal        public void onStatusHintsChanged(Connection c, StatusHints statusHints) {}
2576d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn        public void onConferenceablesChanged(
2586d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn                Connection c, List<IConferenceable> conferenceables) {}
259823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon        public void onConferenceChanged(Connection c, Conference conference) {}
2603bffcf78b5e4bd8b60543126fc0bdb09808f28f5Tyler Gunn        /** @hide */
261ab4650c4563cd46e65ac37f924fee8febfd759c6Tyler Gunn        public void onConferenceParticipantsChanged(Connection c,
262ab4650c4563cd46e65ac37f924fee8febfd759c6Tyler Gunn                List<ConferenceParticipant> participants) {}
2638a2b1199a6db0c6f2493e96e25ec1d89e3f62769Tyler Gunn        public void onConferenceStarted() {}
264542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad    }
265542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad
26627d1e257f3cba2d5954e5562db69035df9ecf290Tyler Gunn    /** @hide */
267b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad    public static abstract class VideoProvider {
268b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
269b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        /**
270b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * Video is not being received (no protocol pause was issued).
271b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         */
272b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        public static final int SESSION_EVENT_RX_PAUSE = 1;
273b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
274b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        /**
275b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * Video reception has resumed after a SESSION_EVENT_RX_PAUSE.
276b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         */
277b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        public static final int SESSION_EVENT_RX_RESUME = 2;
278b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
279b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        /**
280b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * Video transmission has begun. This occurs after a negotiated start of video transmission
281b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * when the underlying protocol has actually begun transmitting video to the remote party.
282b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         */
283b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        public static final int SESSION_EVENT_TX_START = 3;
284b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
285b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        /**
286b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * Video transmission has stopped. This occurs after a negotiated stop of video transmission
287b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * when the underlying protocol has actually stopped transmitting video to the remote party.
288b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         */
289b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        public static final int SESSION_EVENT_TX_STOP = 4;
290b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
291b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        /**
292b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * A camera failure has occurred for the selected camera.  The In-Call UI can use this as a
293b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * cue to inform the user the camera is not available.
294b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         */
295b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        public static final int SESSION_EVENT_CAMERA_FAILURE = 5;
296b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
297b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        /**
298b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * Issued after {@code SESSION_EVENT_CAMERA_FAILURE} when the camera is once again ready for
299b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * operation.  The In-Call UI can use this as a cue to inform the user that the camera has
300b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * become available again.
301b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         */
302b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        public static final int SESSION_EVENT_CAMERA_READY = 6;
303b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
304b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        /**
305b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * Session modify request was successful.
306b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         */
307b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        public static final int SESSION_MODIFY_REQUEST_SUCCESS = 1;
308b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
309b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        /**
310b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * Session modify request failed.
311b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         */
312b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        public static final int SESSION_MODIFY_REQUEST_FAIL = 2;
313b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
314b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        /**
315b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * Session modify request ignored due to invalid parameters.
316b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         */
317b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        public static final int SESSION_MODIFY_REQUEST_INVALID = 3;
318b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
319a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad        private static final int MSG_SET_VIDEO_CALLBACK = 1;
320b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        private static final int MSG_SET_CAMERA = 2;
321b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        private static final int MSG_SET_PREVIEW_SURFACE = 3;
322b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        private static final int MSG_SET_DISPLAY_SURFACE = 4;
323b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        private static final int MSG_SET_DEVICE_ORIENTATION = 5;
324b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        private static final int MSG_SET_ZOOM = 6;
325b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        private static final int MSG_SEND_SESSION_MODIFY_REQUEST = 7;
326b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        private static final int MSG_SEND_SESSION_MODIFY_RESPONSE = 8;
327b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        private static final int MSG_REQUEST_CAMERA_CAPABILITIES = 9;
3285c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        private static final int MSG_REQUEST_CONNECTION_DATA_USAGE = 10;
329b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        private static final int MSG_SET_PAUSE_IMAGE = 11;
330b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
331b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        private final VideoProvider.VideoProviderHandler
332b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                mMessageHandler = new VideoProvider.VideoProviderHandler();
333b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        private final VideoProvider.VideoProviderBinder mBinder;
334a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad        private IVideoCallback mVideoCallback;
335b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
336b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        /**
337b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * Default handler used to consolidate binder method calls onto a single thread.
338b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         */
339b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        private final class VideoProviderHandler extends Handler {
340b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            @Override
341b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            public void handleMessage(Message msg) {
342b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                switch (msg.what) {
343a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad                    case MSG_SET_VIDEO_CALLBACK:
344a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad                        mVideoCallback = IVideoCallback.Stub.asInterface((IBinder) msg.obj);
345b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                        break;
346b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                    case MSG_SET_CAMERA:
347b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                        onSetCamera((String) msg.obj);
348b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                        break;
349b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                    case MSG_SET_PREVIEW_SURFACE:
350b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                        onSetPreviewSurface((Surface) msg.obj);
351b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                        break;
352b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                    case MSG_SET_DISPLAY_SURFACE:
353b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                        onSetDisplaySurface((Surface) msg.obj);
354b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                        break;
355b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                    case MSG_SET_DEVICE_ORIENTATION:
356b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                        onSetDeviceOrientation(msg.arg1);
357b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                        break;
358b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                    case MSG_SET_ZOOM:
359b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                        onSetZoom((Float) msg.obj);
360b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                        break;
361b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                    case MSG_SEND_SESSION_MODIFY_REQUEST:
362b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                        onSendSessionModifyRequest((VideoProfile) msg.obj);
363b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                        break;
364b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                    case MSG_SEND_SESSION_MODIFY_RESPONSE:
365b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                        onSendSessionModifyResponse((VideoProfile) msg.obj);
366b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                        break;
367b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                    case MSG_REQUEST_CAMERA_CAPABILITIES:
368b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                        onRequestCameraCapabilities();
369b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                        break;
3705c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad                    case MSG_REQUEST_CONNECTION_DATA_USAGE:
3715c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad                        onRequestConnectionDataUsage();
372b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                        break;
373b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                    case MSG_SET_PAUSE_IMAGE:
374b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                        onSetPauseImage((String) msg.obj);
375b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                        break;
376b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                    default:
377b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                        break;
378b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                }
379b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            }
380b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        }
381b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
382b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        /**
383b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * IVideoProvider stub implementation.
384b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         */
385b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        private final class VideoProviderBinder extends IVideoProvider.Stub {
386a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad            public void setVideoCallback(IBinder videoCallbackBinder) {
387b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                mMessageHandler.obtainMessage(
388a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad                        MSG_SET_VIDEO_CALLBACK, videoCallbackBinder).sendToTarget();
389b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            }
390b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
391b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            public void setCamera(String cameraId) {
392b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                mMessageHandler.obtainMessage(MSG_SET_CAMERA, cameraId).sendToTarget();
393b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            }
394b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
395b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            public void setPreviewSurface(Surface surface) {
396b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                mMessageHandler.obtainMessage(MSG_SET_PREVIEW_SURFACE, surface).sendToTarget();
397b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            }
398b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
399b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            public void setDisplaySurface(Surface surface) {
400b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                mMessageHandler.obtainMessage(MSG_SET_DISPLAY_SURFACE, surface).sendToTarget();
401b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            }
402b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
403b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            public void setDeviceOrientation(int rotation) {
404b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                mMessageHandler.obtainMessage(MSG_SET_DEVICE_ORIENTATION, rotation).sendToTarget();
405b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            }
406b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
407b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            public void setZoom(float value) {
408b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                mMessageHandler.obtainMessage(MSG_SET_ZOOM, value).sendToTarget();
409b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            }
410b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
411b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            public void sendSessionModifyRequest(VideoProfile requestProfile) {
412b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                mMessageHandler.obtainMessage(
413b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                        MSG_SEND_SESSION_MODIFY_REQUEST, requestProfile).sendToTarget();
414b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            }
415b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
416b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            public void sendSessionModifyResponse(VideoProfile responseProfile) {
417b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                mMessageHandler.obtainMessage(
418b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                        MSG_SEND_SESSION_MODIFY_RESPONSE, responseProfile).sendToTarget();
419b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            }
420b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
421b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            public void requestCameraCapabilities() {
422b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                mMessageHandler.obtainMessage(MSG_REQUEST_CAMERA_CAPABILITIES).sendToTarget();
423b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            }
424b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
425b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            public void requestCallDataUsage() {
4265c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad                mMessageHandler.obtainMessage(MSG_REQUEST_CONNECTION_DATA_USAGE).sendToTarget();
427b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            }
428b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
429b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            public void setPauseImage(String uri) {
430b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                mMessageHandler.obtainMessage(MSG_SET_PAUSE_IMAGE, uri).sendToTarget();
431b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            }
432b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        }
433b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
434b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        public VideoProvider() {
435b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            mBinder = new VideoProvider.VideoProviderBinder();
436b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        }
437b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
438b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        /**
439b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * Returns binder object which can be used across IPC methods.
440b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * @hide
441b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         */
442b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        public final IVideoProvider getInterface() {
443b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            return mBinder;
444b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        }
445b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
446b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        /**
4475c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad         * Sets the camera to be used for video recording in a video connection.
448b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         *
449b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * @param cameraId The id of the camera.
450b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         */
451b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        public abstract void onSetCamera(String cameraId);
452b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
453b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        /**
454b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * Sets the surface to be used for displaying a preview of what the user's camera is
455b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * currently capturing.  When video transmission is enabled, this is the video signal which
456b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * is sent to the remote device.
457b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         *
458b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * @param surface The surface.
459b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         */
460b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        public abstract void onSetPreviewSurface(Surface surface);
461b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
462b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        /**
463b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * Sets the surface to be used for displaying the video received from the remote device.
464b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         *
465b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * @param surface The surface.
466b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         */
467b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        public abstract void onSetDisplaySurface(Surface surface);
468b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
469b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        /**
470b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * Sets the device orientation, in degrees.  Assumes that a standard portrait orientation of
471b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * the device is 0 degrees.
472b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         *
473b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * @param rotation The device orientation, in degrees.
474b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         */
475b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        public abstract void onSetDeviceOrientation(int rotation);
476b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
477b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        /**
478b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * Sets camera zoom ratio.
479b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         *
480b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * @param value The camera zoom ratio.
481b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         */
482b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        public abstract void onSetZoom(float value);
483b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
484b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        /**
485b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * Issues a request to modify the properties of the current session.  The request is
486b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * sent to the remote device where it it handled by the In-Call UI.
4875c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad         * Some examples of session modification requests: upgrade connection from audio to video,
4885c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad         * downgrade connection from video to audio, pause video.
489b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         *
4905c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad         * @param requestProfile The requested connection video properties.
491b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         */
492b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        public abstract void onSendSessionModifyRequest(VideoProfile requestProfile);
493b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
494b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        /**te
4955c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad         * Provides a response to a request to change the current connection session video
496b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * properties.
497b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * This is in response to a request the InCall UI has received via the InCall UI.
498b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         *
4995c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad         * @param responseProfile The response connection video properties.
500b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         */
501b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        public abstract void onSendSessionModifyResponse(VideoProfile responseProfile);
502b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
503b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        /**
504b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * Issues a request to the video provider to retrieve the camera capabilities.
505b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * Camera capabilities are reported back to the caller via the In-Call UI.
506b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         */
507b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        public abstract void onRequestCameraCapabilities();
508b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
509b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        /**
510b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * Issues a request to the video telephony framework to retrieve the cumulative data usage
5115c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad         * for the current connection.  Data usage is reported back to the caller via the
512b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * InCall UI.
513b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         */
5145c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        public abstract void onRequestConnectionDataUsage();
515b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
516b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        /**
517b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * Provides the video telephony framework with the URI of an image to be displayed to remote
518b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * devices when the video signal is paused.
519b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         *
520b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * @param uri URI of image to display.
521b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         */
522b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        public abstract void onSetPauseImage(String uri);
523b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
524b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        /**
525b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * Invokes callback method defined in In-Call UI.
526b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         *
5275c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad         * @param videoProfile The requested video connection profile.
528b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         */
529b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        public void receiveSessionModifyRequest(VideoProfile videoProfile) {
530a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad            if (mVideoCallback != null) {
531b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                try {
532a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad                    mVideoCallback.receiveSessionModifyRequest(videoProfile);
533b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                } catch (RemoteException ignored) {
534b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                }
535b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            }
536b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        }
537b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
538b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        /**
539b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * Invokes callback method defined in In-Call UI.
540b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         *
541b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * @param status Status of the session modify request.  Valid values are
542b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         *               {@link VideoProvider#SESSION_MODIFY_REQUEST_SUCCESS},
543b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         *               {@link VideoProvider#SESSION_MODIFY_REQUEST_FAIL},
544b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         *               {@link VideoProvider#SESSION_MODIFY_REQUEST_INVALID}
545b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * @param requestedProfile The original request which was sent to the remote device.
546b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * @param responseProfile The actual profile changes made by the remote device.
547b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         */
548b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        public void receiveSessionModifyResponse(int status,
549b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                VideoProfile requestedProfile, VideoProfile responseProfile) {
550a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad            if (mVideoCallback != null) {
551b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                try {
552a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad                    mVideoCallback.receiveSessionModifyResponse(
553b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                            status, requestedProfile, responseProfile);
554b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                } catch (RemoteException ignored) {
555b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                }
556b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            }
557b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        }
558542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad
559b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        /**
560b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * Invokes callback method defined in In-Call UI.
561b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         *
562b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * Valid values are: {@link VideoProvider#SESSION_EVENT_RX_PAUSE},
563b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * {@link VideoProvider#SESSION_EVENT_RX_RESUME},
564b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * {@link VideoProvider#SESSION_EVENT_TX_START},
565b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * {@link VideoProvider#SESSION_EVENT_TX_STOP}
566b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         *
567b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * @param event The event.
568b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         */
569b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        public void handleCallSessionEvent(int event) {
570a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad            if (mVideoCallback != null) {
571b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                try {
572a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad                    mVideoCallback.handleCallSessionEvent(event);
573b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                } catch (RemoteException ignored) {
574b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                }
575b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            }
576b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        }
577b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
578b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        /**
579b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * Invokes callback method defined in In-Call UI.
580b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         *
581b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * @param width  The updated peer video width.
582b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * @param height The updated peer video height.
583b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         */
584b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        public void changePeerDimensions(int width, int height) {
585a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad            if (mVideoCallback != null) {
586b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                try {
587a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad                    mVideoCallback.changePeerDimensions(width, height);
588b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                } catch (RemoteException ignored) {
589b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                }
590b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            }
591b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        }
592bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton
593b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        /**
594b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * Invokes callback method defined in In-Call UI.
595b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         *
596b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * @param dataUsage The updated data usage.
597b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         */
598b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        public void changeCallDataUsage(int dataUsage) {
599a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad            if (mVideoCallback != null) {
600b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                try {
601a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad                    mVideoCallback.changeCallDataUsage(dataUsage);
602b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                } catch (RemoteException ignored) {
603b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                }
604b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            }
605b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        }
606b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
607b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        /**
608b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * Invokes callback method defined in In-Call UI.
609b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         *
610b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * @param cameraCapabilities The changed camera capabilities.
611b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         */
612b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        public void changeCameraCapabilities(CameraCapabilities cameraCapabilities) {
613a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad            if (mVideoCallback != null) {
614b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                try {
615a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad                    mVideoCallback.changeCameraCapabilities(cameraCapabilities);
616b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                } catch (RemoteException ignored) {
617b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                }
618b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            }
619b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        }
620542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad    }
621542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad
6227c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon    private final Listener mConnectionDeathListener = new Listener() {
6237c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon        @Override
6247c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon        public void onDestroyed(Connection c) {
6256d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn            if (mConferenceables.remove(c)) {
6266d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn                fireOnConferenceableConnectionsChanged();
6276d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn            }
6286d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn        }
6296d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn    };
6306d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn
6316d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn    private final Conference.Listener mConferenceDeathListener = new Conference.Listener() {
6326d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn        @Override
6336d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn        public void onDestroyed(Conference c) {
6346d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn            if (mConferenceables.remove(c)) {
6357c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon                fireOnConferenceableConnectionsChanged();
6367c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon            }
6377c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon        }
6387c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon    };
6397c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon
640229e3820dce98f64fd4834d5f421faec9a9d7026Jay Shrauner    /**
641229e3820dce98f64fd4834d5f421faec9a9d7026Jay Shrauner     * ConcurrentHashMap constructor params: 8 is initial table size, 0.9f is
642229e3820dce98f64fd4834d5f421faec9a9d7026Jay Shrauner     * load factor before resizing, 1 means we only expect a single thread to
643229e3820dce98f64fd4834d5f421faec9a9d7026Jay Shrauner     * access the map so make only a single shard
644229e3820dce98f64fd4834d5f421faec9a9d7026Jay Shrauner     */
645229e3820dce98f64fd4834d5f421faec9a9d7026Jay Shrauner    private final Set<Listener> mListeners = Collections.newSetFromMap(
646229e3820dce98f64fd4834d5f421faec9a9d7026Jay Shrauner            new ConcurrentHashMap<Listener, Boolean>(8, 0.9f, 1));
6476d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn    private final List<IConferenceable> mConferenceables = new ArrayList<>();
6486d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn    private final List<IConferenceable> mUnmodifiableConferenceables =
6496d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn            Collections.unmodifiableList(mConferenceables);
650b693998fdfdd4498a33c4c69405f2708e4840aa7Santos Cordon
651b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad    private int mState = STATE_NEW;
652b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad    private AudioState mAudioState;
653100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee    private Uri mAddress;
654100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee    private int mAddressPresentation;
655612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepal    private String mCallerDisplayName;
656612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepal    private int mCallerDisplayNamePresentation;
657100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee    private boolean mRingbackRequested = false;
6585c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad    private int mConnectionCapabilities;
659b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad    private VideoProvider mVideoProvider;
66033aaae4a07fdcce223fe74d96d751f4bffa6723aSailesh Nepal    private boolean mAudioModeIsVoip;
661e7ef59a77d55c9802cc7d919f7dd794bd5fea30eSailesh Nepal    private StatusHints mStatusHints;
662aa07df84f279a87ad6370758c9d792a660f2cebbTyler Gunn    private int mVideoState;
6637f3d41fd124dd7c4a8b72c1d48df08a8ee7209ecAndrew Lee    private DisconnectCause mDisconnectCause;
664823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon    private Conference mConference;
665823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon    private ConnectionService mConnectionService;
666542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad
667542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad    /**
668542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     * Create a new Connection.
669542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     */
670f29511043e1c3bf750e28427410192c793363bf7Santos Cordon    public Connection() {}
671542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad
672542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad    /**
673100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee     * @return The address (e.g., phone number) to which this Connection is currently communicating.
674542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     */
675100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee    public final Uri getAddress() {
676100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee        return mAddress;
677542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad    }
678542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad
679542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad    /**
680100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee     * @return The presentation requirements for the address.
681ef9f6f957d897ea0ed82114185b8fa3fefd4917bTyler Gunn     *         See {@link TelecomManager} for valid values.
682542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     */
683100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee    public final int getAddressPresentation() {
684100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee        return mAddressPresentation;
685612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepal    }
686612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepal
687612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepal    /**
688612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepal     * @return The caller display name (CNAP).
689612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepal     */
690612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepal    public final String getCallerDisplayName() {
691612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepal        return mCallerDisplayName;
692612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepal    }
693612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepal
694612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepal    /**
6959d568c01db1f90fbe9cbff1d9385e7e7b809e066Nancy Chen     * @return The presentation requirements for the handle.
696ef9f6f957d897ea0ed82114185b8fa3fefd4917bTyler Gunn     *         See {@link TelecomManager} for valid values.
697612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepal     */
698612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepal    public final int getCallerDisplayNamePresentation() {
699612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepal        return mCallerDisplayNamePresentation;
700542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad    }
701542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad
702542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad    /**
703612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepal     * @return The state of this Connection.
7048d83fa9bbd2ad15299a4419241eb10404e7839beTyler Gunn     */
705612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepal    public final int getState() {
706612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepal        return mState;
7072a46b90222e5c9c73de012382a604a71f9c0c30cSailesh Nepal    }
7088d83fa9bbd2ad15299a4419241eb10404e7839beTyler Gunn
7098d83fa9bbd2ad15299a4419241eb10404e7839beTyler Gunn    /**
7105c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * Returns the video state of the connection.
711b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad     * Valid values: {@link VideoProfile.VideoState#AUDIO_ONLY},
712b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad     * {@link VideoProfile.VideoState#BIDIRECTIONAL},
713b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad     * {@link VideoProfile.VideoState#TX_ENABLED},
714b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad     * {@link VideoProfile.VideoState#RX_ENABLED}.
715aa07df84f279a87ad6370758c9d792a660f2cebbTyler Gunn     *
7165c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * @return The video state of the connection.
71727d1e257f3cba2d5954e5562db69035df9ecf290Tyler Gunn     * @hide
718aa07df84f279a87ad6370758c9d792a660f2cebbTyler Gunn     */
719aa07df84f279a87ad6370758c9d792a660f2cebbTyler Gunn    public final int getVideoState() {
720aa07df84f279a87ad6370758c9d792a660f2cebbTyler Gunn        return mVideoState;
721aa07df84f279a87ad6370758c9d792a660f2cebbTyler Gunn    }
722aa07df84f279a87ad6370758c9d792a660f2cebbTyler Gunn
723aa07df84f279a87ad6370758c9d792a660f2cebbTyler Gunn    /**
7245c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * @return The audio state of the connection, describing how its audio is currently
725542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     *         being routed by the system. This is {@code null} if this Connection
726542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     *         does not directly know about its audio state.
727542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     */
728b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad    public final AudioState getAudioState() {
729b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        return mAudioState;
730542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad    }
731542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad
732542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad    /**
733823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon     * @return The conference that this connection is a part of.  Null if it is not part of any
734823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon     *         conference.
7352a46b90222e5c9c73de012382a604a71f9c0c30cSailesh Nepal     */
736823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon    public final Conference getConference() {
737823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon        return mConference;
7382a46b90222e5c9c73de012382a604a71f9c0c30cSailesh Nepal    }
7392a46b90222e5c9c73de012382a604a71f9c0c30cSailesh Nepal
7402a46b90222e5c9c73de012382a604a71f9c0c30cSailesh Nepal    /**
741823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon     * Returns whether this connection is requesting that the system play a ringback tone
742823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon     * on its behalf.
7432a46b90222e5c9c73de012382a604a71f9c0c30cSailesh Nepal     */
744100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee    public final boolean isRingbackRequested() {
745100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee        return mRingbackRequested;
7462a46b90222e5c9c73de012382a604a71f9c0c30cSailesh Nepal    }
7472a46b90222e5c9c73de012382a604a71f9c0c30cSailesh Nepal
7482a46b90222e5c9c73de012382a604a71f9c0c30cSailesh Nepal    /**
74933aaae4a07fdcce223fe74d96d751f4bffa6723aSailesh Nepal     * @return True if the connection's audio mode is VOIP.
75033aaae4a07fdcce223fe74d96d751f4bffa6723aSailesh Nepal     */
75133aaae4a07fdcce223fe74d96d751f4bffa6723aSailesh Nepal    public final boolean getAudioModeIsVoip() {
75233aaae4a07fdcce223fe74d96d751f4bffa6723aSailesh Nepal        return mAudioModeIsVoip;
75333aaae4a07fdcce223fe74d96d751f4bffa6723aSailesh Nepal    }
75433aaae4a07fdcce223fe74d96d751f4bffa6723aSailesh Nepal
75533aaae4a07fdcce223fe74d96d751f4bffa6723aSailesh Nepal    /**
756e7ef59a77d55c9802cc7d919f7dd794bd5fea30eSailesh Nepal     * @return The status hints for this connection.
757e7ef59a77d55c9802cc7d919f7dd794bd5fea30eSailesh Nepal     */
758e7ef59a77d55c9802cc7d919f7dd794bd5fea30eSailesh Nepal    public final StatusHints getStatusHints() {
759e7ef59a77d55c9802cc7d919f7dd794bd5fea30eSailesh Nepal        return mStatusHints;
760e7ef59a77d55c9802cc7d919f7dd794bd5fea30eSailesh Nepal    }
761e7ef59a77d55c9802cc7d919f7dd794bd5fea30eSailesh Nepal
762e7ef59a77d55c9802cc7d919f7dd794bd5fea30eSailesh Nepal    /**
763542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     * Assign a listener to be notified of state changes.
764542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     *
765542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     * @param l A listener.
766542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     * @return This Connection.
767542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     *
768542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     * @hide
769542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     */
770542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad    public final Connection addConnectionListener(Listener l) {
771d34e5713c9571859d12e9c2e83ce3946cacdd68eSantos Cordon        mListeners.add(l);
772542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad        return this;
773542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad    }
774542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad
775542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad    /**
776542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     * Remove a previously assigned listener that was being notified of state changes.
777542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     *
778542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     * @param l A Listener.
779542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     * @return This Connection.
780542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     *
781542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     * @hide
782542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     */
783542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad    public final Connection removeConnectionListener(Listener l) {
784229e3820dce98f64fd4834d5f421faec9a9d7026Jay Shrauner        if (l != null) {
785229e3820dce98f64fd4834d5f421faec9a9d7026Jay Shrauner            mListeners.remove(l);
786229e3820dce98f64fd4834d5f421faec9a9d7026Jay Shrauner        }
787542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad        return this;
788542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad    }
789542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad
790542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad    /**
791cf7020b7e84c1f5190db7167d70cb0675cd3332fSailesh Nepal     * @return The {@link DisconnectCause} for this connection.
792bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton     */
7937f3d41fd124dd7c4a8b72c1d48df08a8ee7209ecAndrew Lee    public final DisconnectCause getDisconnectCause() {
794cf7020b7e84c1f5190db7167d70cb0675cd3332fSailesh Nepal        return mDisconnectCause;
795bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton    }
796bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton
797bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton    /**
798542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     * Inform this Connection that the state of its audio output has been changed externally.
799542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     *
800542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     * @param state The new audio state.
801400cc48512dc69e940ad4d233a3b47ee9574601dSailesh Nepal     * @hide
802542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     */
803b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad    final void setAudioState(AudioState state) {
8045c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        checkImmutable();
80560ac30bb8a30fa7283d592c12ddf2da9447adf14Ihab Awad        Log.d(this, "setAudioState %s", state);
806b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        mAudioState = state;
807354b2bd0fe8647bd5c7e28f3598b9b7414846124Nancy Chen        onAudioStateChanged(state);
808542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad    }
809542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad
810542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad    /**
811b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad     * @param state An integer value of a {@code STATE_*} constant.
812542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     * @return A string representation of the value.
813542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     */
814542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad    public static String stateToString(int state) {
815542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad        switch (state) {
816b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            case STATE_INITIALIZING:
817b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                return "STATE_INITIALIZING";
818b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            case STATE_NEW:
819b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                return "STATE_NEW";
820b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            case STATE_RINGING:
821b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                return "STATE_RINGING";
822b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            case STATE_DIALING:
823b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                return "STATE_DIALING";
824b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            case STATE_ACTIVE:
825b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                return "STATE_ACTIVE";
826b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            case STATE_HOLDING:
827b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                return "STATE_HOLDING";
828b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            case STATE_DISCONNECTED:
829542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad                return "DISCONNECTED";
830542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad            default:
83160ac30bb8a30fa7283d592c12ddf2da9447adf14Ihab Awad                Log.wtf(Connection.class, "Unknown state %d", state);
832542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad                return "UNKNOWN";
833542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad        }
834542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad    }
835542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad
836542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad    /**
8375c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * Returns the connection's capabilities, as a bit mask of the {@code CAPABILITY_*} constants.
83852a28f619fca8c2118e1f421cb56f6542805e954Ihab Awad     */
8395c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad    public final int getConnectionCapabilities() {
8405c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        return mConnectionCapabilities;
84152a28f619fca8c2118e1f421cb56f6542805e954Ihab Awad    }
84252a28f619fca8c2118e1f421cb56f6542805e954Ihab Awad
843ef77f0ed78db3cfa098a26d6186abbd59c5cfd15Sailesh Nepal    /** @hide */
844ef77f0ed78db3cfa098a26d6186abbd59c5cfd15Sailesh Nepal    @SystemApi @Deprecated public final int getCallCapabilities() {
845ef77f0ed78db3cfa098a26d6186abbd59c5cfd15Sailesh Nepal        return getConnectionCapabilities();
846ef77f0ed78db3cfa098a26d6186abbd59c5cfd15Sailesh Nepal    }
847ef77f0ed78db3cfa098a26d6186abbd59c5cfd15Sailesh Nepal
84852a28f619fca8c2118e1f421cb56f6542805e954Ihab Awad    /**
849100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee     * Sets the value of the {@link #getAddress()} property.
850542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     *
851100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee     * @param address The new address.
852100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee     * @param presentation The presentation requirements for the address.
853ef9f6f957d897ea0ed82114185b8fa3fefd4917bTyler Gunn     *        See {@link TelecomManager} for valid values.
854542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     */
855100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee    public final void setAddress(Uri address, int presentation) {
8565c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        checkImmutable();
857100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee        Log.d(this, "setAddress %s", address);
858100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee        mAddress = address;
859100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee        mAddressPresentation = presentation;
860d34e5713c9571859d12e9c2e83ce3946cacdd68eSantos Cordon        for (Listener l : mListeners) {
861100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee            l.onAddressChanged(this, address, presentation);
862d34e5713c9571859d12e9c2e83ce3946cacdd68eSantos Cordon        }
863542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad    }
864542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad
865542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad    /**
866612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepal     * Sets the caller display name (CNAP).
8672a46b90222e5c9c73de012382a604a71f9c0c30cSailesh Nepal     *
868612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepal     * @param callerDisplayName The new display name.
8699d568c01db1f90fbe9cbff1d9385e7e7b809e066Nancy Chen     * @param presentation The presentation requirements for the handle.
870ef9f6f957d897ea0ed82114185b8fa3fefd4917bTyler Gunn     *        See {@link TelecomManager} for valid values.
871612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepal     */
872612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepal    public final void setCallerDisplayName(String callerDisplayName, int presentation) {
8735c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        checkImmutable();
874612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepal        Log.d(this, "setCallerDisplayName %s", callerDisplayName);
875d34e5713c9571859d12e9c2e83ce3946cacdd68eSantos Cordon        mCallerDisplayName = callerDisplayName;
876d34e5713c9571859d12e9c2e83ce3946cacdd68eSantos Cordon        mCallerDisplayNamePresentation = presentation;
877d34e5713c9571859d12e9c2e83ce3946cacdd68eSantos Cordon        for (Listener l : mListeners) {
878d34e5713c9571859d12e9c2e83ce3946cacdd68eSantos Cordon            l.onCallerDisplayNameChanged(this, callerDisplayName, presentation);
879d34e5713c9571859d12e9c2e83ce3946cacdd68eSantos Cordon        }
8802a46b90222e5c9c73de012382a604a71f9c0c30cSailesh Nepal    }
8812a46b90222e5c9c73de012382a604a71f9c0c30cSailesh Nepal
8822a46b90222e5c9c73de012382a604a71f9c0c30cSailesh Nepal    /**
883aa07df84f279a87ad6370758c9d792a660f2cebbTyler Gunn     * Set the video state for the connection.
884b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad     * Valid values: {@link VideoProfile.VideoState#AUDIO_ONLY},
885b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad     * {@link VideoProfile.VideoState#BIDIRECTIONAL},
886b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad     * {@link VideoProfile.VideoState#TX_ENABLED},
887b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad     * {@link VideoProfile.VideoState#RX_ENABLED}.
888aa07df84f279a87ad6370758c9d792a660f2cebbTyler Gunn     *
889aa07df84f279a87ad6370758c9d792a660f2cebbTyler Gunn     * @param videoState The new video state.
89027d1e257f3cba2d5954e5562db69035df9ecf290Tyler Gunn     * @hide
891aa07df84f279a87ad6370758c9d792a660f2cebbTyler Gunn     */
892aa07df84f279a87ad6370758c9d792a660f2cebbTyler Gunn    public final void setVideoState(int videoState) {
8935c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        checkImmutable();
894aa07df84f279a87ad6370758c9d792a660f2cebbTyler Gunn        Log.d(this, "setVideoState %d", videoState);
895d34e5713c9571859d12e9c2e83ce3946cacdd68eSantos Cordon        mVideoState = videoState;
896d34e5713c9571859d12e9c2e83ce3946cacdd68eSantos Cordon        for (Listener l : mListeners) {
897d34e5713c9571859d12e9c2e83ce3946cacdd68eSantos Cordon            l.onVideoStateChanged(this, mVideoState);
898d34e5713c9571859d12e9c2e83ce3946cacdd68eSantos Cordon        }
899aa07df84f279a87ad6370758c9d792a660f2cebbTyler Gunn    }
900aa07df84f279a87ad6370758c9d792a660f2cebbTyler Gunn
901aa07df84f279a87ad6370758c9d792a660f2cebbTyler Gunn    /**
9025c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * Sets state to active (e.g., an ongoing connection where two or more parties can actively
903542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     * communicate).
904542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     */
905400cc48512dc69e940ad4d233a3b47ee9574601dSailesh Nepal    public final void setActive() {
9065c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        checkImmutable();
907100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee        setRingbackRequested(false);
908b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        setState(STATE_ACTIVE);
909542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad    }
910542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad
911542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad    /**
9125c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * Sets state to ringing (e.g., an inbound ringing connection).
913542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     */
914400cc48512dc69e940ad4d233a3b47ee9574601dSailesh Nepal    public final void setRinging() {
9155c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        checkImmutable();
916b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        setState(STATE_RINGING);
917542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad    }
918542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad
919542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad    /**
920bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton     * Sets state to initializing (this Connection is not yet ready to be used).
921bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton     */
922bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton    public final void setInitializing() {
9235c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        checkImmutable();
924b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        setState(STATE_INITIALIZING);
925bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton    }
926bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton
927bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton    /**
928bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton     * Sets state to initialized (the Connection has been set up and is now ready to be used).
929bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton     */
930bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton    public final void setInitialized() {
9315c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        checkImmutable();
932b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        setState(STATE_NEW);
933bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton    }
934bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton
935bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton    /**
9365c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * Sets state to dialing (e.g., dialing an outbound connection).
937542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     */
938400cc48512dc69e940ad4d233a3b47ee9574601dSailesh Nepal    public final void setDialing() {
9395c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        checkImmutable();
940b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        setState(STATE_DIALING);
941542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad    }
942542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad
943542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad    /**
944542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     * Sets state to be on hold.
945542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     */
946400cc48512dc69e940ad4d233a3b47ee9574601dSailesh Nepal    public final void setOnHold() {
9475c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        checkImmutable();
948b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        setState(STATE_HOLDING);
949542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad    }
950542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad
951542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad    /**
9525c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * Sets the video connection provider.
953b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad     * @param videoProvider The video provider.
95427d1e257f3cba2d5954e5562db69035df9ecf290Tyler Gunn     * @hide
9555ffbe8b850c2703b64617f0140d051a5412dd861Andrew Lee     */
956b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad    public final void setVideoProvider(VideoProvider videoProvider) {
9575c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        checkImmutable();
958b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        mVideoProvider = videoProvider;
959d34e5713c9571859d12e9c2e83ce3946cacdd68eSantos Cordon        for (Listener l : mListeners) {
960b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            l.onVideoProviderChanged(this, videoProvider);
961d34e5713c9571859d12e9c2e83ce3946cacdd68eSantos Cordon        }
9625ffbe8b850c2703b64617f0140d051a5412dd861Andrew Lee    }
9635ffbe8b850c2703b64617f0140d051a5412dd861Andrew Lee
96427d1e257f3cba2d5954e5562db69035df9ecf290Tyler Gunn    /** @hide */
965b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad    public final VideoProvider getVideoProvider() {
966b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        return mVideoProvider;
967a27a1938ab27aeb17144867b231f830622fa6ad4Andrew Lee    }
968a27a1938ab27aeb17144867b231f830622fa6ad4Andrew Lee
9695ffbe8b850c2703b64617f0140d051a5412dd861Andrew Lee    /**
970091768c3021d740b7d66846d36405c4d4c76cc56Sailesh Nepal     * Sets state to disconnected.
971542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     *
9727f3d41fd124dd7c4a8b72c1d48df08a8ee7209ecAndrew Lee     * @param disconnectCause The reason for the disconnection, as specified by
973b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad     *         {@link DisconnectCause}.
974542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     */
9757f3d41fd124dd7c4a8b72c1d48df08a8ee7209ecAndrew Lee    public final void setDisconnected(DisconnectCause disconnectCause) {
9765c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        checkImmutable();
9777f3d41fd124dd7c4a8b72c1d48df08a8ee7209ecAndrew Lee        mDisconnectCause = disconnectCause;
978b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        setState(STATE_DISCONNECTED);
979f34519b4dd12d065c510b06922a196e8a3fd9885mike dooley        Log.d(this, "Disconnected with cause %s", disconnectCause);
980d34e5713c9571859d12e9c2e83ce3946cacdd68eSantos Cordon        for (Listener l : mListeners) {
9817f3d41fd124dd7c4a8b72c1d48df08a8ee7209ecAndrew Lee            l.onDisconnected(this, disconnectCause);
982d34e5713c9571859d12e9c2e83ce3946cacdd68eSantos Cordon        }
983542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad    }
984542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad
985542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad    /**
9865c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * Informs listeners that this {@code Connection} is in a post-dial wait state. This is done
9875c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * when (a) the {@code Connection} is issuing a DTMF sequence; (b) it has encountered a "wait"
9885c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * character; and (c) it wishes to inform the In-Call app that it is waiting for the end-user
9895c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * to send an {@link #onPostDialContinue(boolean)} signal.
9905c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     *
9915c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * @param remaining The DTMF character sequence remaining to be emitted once the
9925c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     *         {@link #onPostDialContinue(boolean)} is received, including any "wait" characters
9935c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     *         that remaining sequence may contain.
994091768c3021d740b7d66846d36405c4d4c76cc56Sailesh Nepal     */
995091768c3021d740b7d66846d36405c4d4c76cc56Sailesh Nepal    public final void setPostDialWait(String remaining) {
9965c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        checkImmutable();
997d34e5713c9571859d12e9c2e83ce3946cacdd68eSantos Cordon        for (Listener l : mListeners) {
998d34e5713c9571859d12e9c2e83ce3946cacdd68eSantos Cordon            l.onPostDialWait(this, remaining);
999d34e5713c9571859d12e9c2e83ce3946cacdd68eSantos Cordon        }
1000091768c3021d740b7d66846d36405c4d4c76cc56Sailesh Nepal    }
1001091768c3021d740b7d66846d36405c4d4c76cc56Sailesh Nepal
1002091768c3021d740b7d66846d36405c4d4c76cc56Sailesh Nepal    /**
100327d1c2d148fe377ca0d2744f0f85789a42c8f808Nancy Chen     * Informs listeners that this {@code Connection} has processed a character in the post-dial
100427d1c2d148fe377ca0d2744f0f85789a42c8f808Nancy Chen     * started state. This is done when (a) the {@code Connection} is issuing a DTMF sequence;
100527d1c2d148fe377ca0d2744f0f85789a42c8f808Nancy Chen     * (b) it has encountered a "wait" character; and (c) it wishes to signal Telecom to play
100627d1c2d148fe377ca0d2744f0f85789a42c8f808Nancy Chen     * the corresponding DTMF tone locally.
100727d1c2d148fe377ca0d2744f0f85789a42c8f808Nancy Chen     *
100827d1c2d148fe377ca0d2744f0f85789a42c8f808Nancy Chen     * @param nextChar The DTMF character that was just processed by the {@code Connection}.
100927d1c2d148fe377ca0d2744f0f85789a42c8f808Nancy Chen     *
101027d1c2d148fe377ca0d2744f0f85789a42c8f808Nancy Chen     * @hide
101127d1c2d148fe377ca0d2744f0f85789a42c8f808Nancy Chen     */
101227d1c2d148fe377ca0d2744f0f85789a42c8f808Nancy Chen    public final void setNextPostDialWaitChar(char nextChar) {
101327d1c2d148fe377ca0d2744f0f85789a42c8f808Nancy Chen        checkImmutable();
101427d1c2d148fe377ca0d2744f0f85789a42c8f808Nancy Chen        for (Listener l : mListeners) {
101527d1c2d148fe377ca0d2744f0f85789a42c8f808Nancy Chen            l.onPostDialChar(this, nextChar);
101627d1c2d148fe377ca0d2744f0f85789a42c8f808Nancy Chen        }
101727d1c2d148fe377ca0d2744f0f85789a42c8f808Nancy Chen    }
101827d1c2d148fe377ca0d2744f0f85789a42c8f808Nancy Chen
101927d1c2d148fe377ca0d2744f0f85789a42c8f808Nancy Chen    /**
1020f835897f9f799490de27653ae39141ba6bc14223Ihab Awad     * Requests that the framework play a ringback tone. This is to be invoked by implementations
10215c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * that do not play a ringback tone themselves in the connection's audio stream.
1022f835897f9f799490de27653ae39141ba6bc14223Ihab Awad     *
1023f835897f9f799490de27653ae39141ba6bc14223Ihab Awad     * @param ringback Whether the ringback tone is to be played.
1024f835897f9f799490de27653ae39141ba6bc14223Ihab Awad     */
1025100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee    public final void setRingbackRequested(boolean ringback) {
10265c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        checkImmutable();
1027100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee        if (mRingbackRequested != ringback) {
1028100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee            mRingbackRequested = ringback;
1029d34e5713c9571859d12e9c2e83ce3946cacdd68eSantos Cordon            for (Listener l : mListeners) {
1030100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee                l.onRingbackRequested(this, ringback);
1031d34e5713c9571859d12e9c2e83ce3946cacdd68eSantos Cordon            }
1032d34e5713c9571859d12e9c2e83ce3946cacdd68eSantos Cordon        }
1033f835897f9f799490de27653ae39141ba6bc14223Ihab Awad    }
1034f835897f9f799490de27653ae39141ba6bc14223Ihab Awad
10355c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad    /** @hide */
1036de06133569bb80bcfc182dd31d2348f006b79ff5Ihab Awad    @SystemApi @Deprecated public final void setCallCapabilities(int connectionCapabilities) {
10375c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        setConnectionCapabilities(connectionCapabilities);
10385c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad    }
10395c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad
1040f835897f9f799490de27653ae39141ba6bc14223Ihab Awad    /**
10415c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * Sets the connection's capabilities as a bit mask of the {@code CAPABILITY_*} constants.
10421a7061ba950538c93d92c0448752a212039cc06aSailesh Nepal     *
10435c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * @param connectionCapabilities The new connection capabilities.
1044b693998fdfdd4498a33c4c69405f2708e4840aa7Santos Cordon     */
10455c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad    public final void setConnectionCapabilities(int connectionCapabilities) {
10465c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        checkImmutable();
10475c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        if (mConnectionCapabilities != connectionCapabilities) {
10485c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad            mConnectionCapabilities = connectionCapabilities;
1049d34e5713c9571859d12e9c2e83ce3946cacdd68eSantos Cordon            for (Listener l : mListeners) {
10505c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad                l.onConnectionCapabilitiesChanged(this, mConnectionCapabilities);
1051d34e5713c9571859d12e9c2e83ce3946cacdd68eSantos Cordon            }
1052d34e5713c9571859d12e9c2e83ce3946cacdd68eSantos Cordon        }
1053b693998fdfdd4498a33c4c69405f2708e4840aa7Santos Cordon    }
1054b693998fdfdd4498a33c4c69405f2708e4840aa7Santos Cordon
1055b693998fdfdd4498a33c4c69405f2708e4840aa7Santos Cordon    /**
10567c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon     * Tears down the Connection object.
1057b693998fdfdd4498a33c4c69405f2708e4840aa7Santos Cordon     */
105836a713431ceda2e5462c5dc5d1300f32acf9e63aEvan Charlton    public final void destroy() {
1059229e3820dce98f64fd4834d5f421faec9a9d7026Jay Shrauner        for (Listener l : mListeners) {
1060229e3820dce98f64fd4834d5f421faec9a9d7026Jay Shrauner            l.onDestroyed(this);
1061d34e5713c9571859d12e9c2e83ce3946cacdd68eSantos Cordon        }
1062b693998fdfdd4498a33c4c69405f2708e4840aa7Santos Cordon    }
1063b693998fdfdd4498a33c4c69405f2708e4840aa7Santos Cordon
1064b693998fdfdd4498a33c4c69405f2708e4840aa7Santos Cordon    /**
106533aaae4a07fdcce223fe74d96d751f4bffa6723aSailesh Nepal     * Requests that the framework use VOIP audio mode for this connection.
106633aaae4a07fdcce223fe74d96d751f4bffa6723aSailesh Nepal     *
106733aaae4a07fdcce223fe74d96d751f4bffa6723aSailesh Nepal     * @param isVoip True if the audio mode is VOIP.
106833aaae4a07fdcce223fe74d96d751f4bffa6723aSailesh Nepal     */
106933aaae4a07fdcce223fe74d96d751f4bffa6723aSailesh Nepal    public final void setAudioModeIsVoip(boolean isVoip) {
10705c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        checkImmutable();
1071d34e5713c9571859d12e9c2e83ce3946cacdd68eSantos Cordon        mAudioModeIsVoip = isVoip;
1072d34e5713c9571859d12e9c2e83ce3946cacdd68eSantos Cordon        for (Listener l : mListeners) {
1073d34e5713c9571859d12e9c2e83ce3946cacdd68eSantos Cordon            l.onAudioModeIsVoipChanged(this, isVoip);
1074d34e5713c9571859d12e9c2e83ce3946cacdd68eSantos Cordon        }
107533aaae4a07fdcce223fe74d96d751f4bffa6723aSailesh Nepal    }
107633aaae4a07fdcce223fe74d96d751f4bffa6723aSailesh Nepal
107733aaae4a07fdcce223fe74d96d751f4bffa6723aSailesh Nepal    /**
1078e7ef59a77d55c9802cc7d919f7dd794bd5fea30eSailesh Nepal     * Sets the label and icon status to display in the in-call UI.
1079e7ef59a77d55c9802cc7d919f7dd794bd5fea30eSailesh Nepal     *
1080e7ef59a77d55c9802cc7d919f7dd794bd5fea30eSailesh Nepal     * @param statusHints The status label and icon to set.
1081e7ef59a77d55c9802cc7d919f7dd794bd5fea30eSailesh Nepal     */
1082e7ef59a77d55c9802cc7d919f7dd794bd5fea30eSailesh Nepal    public final void setStatusHints(StatusHints statusHints) {
10835c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        checkImmutable();
1084d34e5713c9571859d12e9c2e83ce3946cacdd68eSantos Cordon        mStatusHints = statusHints;
1085d34e5713c9571859d12e9c2e83ce3946cacdd68eSantos Cordon        for (Listener l : mListeners) {
1086d34e5713c9571859d12e9c2e83ce3946cacdd68eSantos Cordon            l.onStatusHintsChanged(this, statusHints);
1087d34e5713c9571859d12e9c2e83ce3946cacdd68eSantos Cordon        }
1088e7ef59a77d55c9802cc7d919f7dd794bd5fea30eSailesh Nepal    }
1089e7ef59a77d55c9802cc7d919f7dd794bd5fea30eSailesh Nepal
1090e7ef59a77d55c9802cc7d919f7dd794bd5fea30eSailesh Nepal    /**
10917c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon     * Sets the connections with which this connection can be conferenced.
10927c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon     *
10937c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon     * @param conferenceableConnections The set of connections this connection can conference with.
10947c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon     */
10957c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon    public final void setConferenceableConnections(List<Connection> conferenceableConnections) {
10965c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        checkImmutable();
10977c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon        clearConferenceableList();
10987c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon        for (Connection c : conferenceableConnections) {
10997c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon            // If statement checks for duplicates in input. It makes it N^2 but we're dealing with a
11007c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon            // small amount of items here.
11016d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn            if (!mConferenceables.contains(c)) {
11027c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon                c.addConnectionListener(mConnectionDeathListener);
11036d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn                mConferenceables.add(c);
11047c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon            }
11057c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon        }
11067c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon        fireOnConferenceableConnectionsChanged();
11077c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon    }
11087c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon
11097c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon    /**
11106d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn     * Similar to {@link #setConferenceableConnections(java.util.List)}, sets a list of connections
11116d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn     * or conferences with which this connection can be conferenced.
11126d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn     *
11136d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn     * @param conferenceables The conferenceables.
1114b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad     */
11156d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn    public final void setConferenceables(List<IConferenceable> conferenceables) {
11166d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn        clearConferenceableList();
11176d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn        for (IConferenceable c : conferenceables) {
11186d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn            // If statement checks for duplicates in input. It makes it N^2 but we're dealing with a
11196d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn            // small amount of items here.
11206d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn            if (!mConferenceables.contains(c)) {
11216d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn                if (c instanceof Connection) {
11226d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn                    Connection connection = (Connection) c;
11236d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn                    connection.addConnectionListener(mConnectionDeathListener);
11246d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn                } else if (c instanceof Conference) {
11256d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn                    Conference conference = (Conference) c;
11266d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn                    conference.addListener(mConferenceDeathListener);
11276d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn                }
11286d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn                mConferenceables.add(c);
11296d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn            }
11306d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn        }
11316d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn        fireOnConferenceableConnectionsChanged();
11326d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn    }
11336d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn
11346d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn    /**
11356d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn     * Returns the connections or conferences with which this connection can be conferenced.
11366d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn     */
11376d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn    public final List<IConferenceable> getConferenceables() {
11386d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn        return mUnmodifiableConferenceables;
1139b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad    }
1140b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
11418635c578f0408ca76cbaef5464d27bfde7450425Evan Charlton    /*
1142823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon     * @hide
1143823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon     */
1144823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon    public final void setConnectionService(ConnectionService connectionService) {
11455c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        checkImmutable();
1146823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon        if (mConnectionService != null) {
1147823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon            Log.e(this, new Exception(), "Trying to set ConnectionService on a connection " +
1148823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon                    "which is already associated with another ConnectionService.");
1149823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon        } else {
1150823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon            mConnectionService = connectionService;
1151823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon        }
1152823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon    }
1153823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon
1154823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon    /**
1155823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon     * @hide
1156823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon     */
1157823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon    public final void unsetConnectionService(ConnectionService connectionService) {
1158823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon        if (mConnectionService != connectionService) {
1159823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon            Log.e(this, new Exception(), "Trying to remove ConnectionService from a Connection " +
1160823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon                    "that does not belong to the ConnectionService.");
1161823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon        } else {
1162823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon            mConnectionService = null;
1163823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon        }
1164823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon    }
1165823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon
1166823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon    /**
1167af1b296a41f0b6e3af34e9c2c73bc1029bfa8b2aSantos Cordon     * @hide
1168af1b296a41f0b6e3af34e9c2c73bc1029bfa8b2aSantos Cordon     */
1169af1b296a41f0b6e3af34e9c2c73bc1029bfa8b2aSantos Cordon    public final ConnectionService getConnectionService() {
1170af1b296a41f0b6e3af34e9c2c73bc1029bfa8b2aSantos Cordon        return mConnectionService;
1171af1b296a41f0b6e3af34e9c2c73bc1029bfa8b2aSantos Cordon    }
1172af1b296a41f0b6e3af34e9c2c73bc1029bfa8b2aSantos Cordon
1173af1b296a41f0b6e3af34e9c2c73bc1029bfa8b2aSantos Cordon    /**
1174823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon     * Sets the conference that this connection is a part of. This will fail if the connection is
11755c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * already part of a conference. {@link #resetConference} to un-set the conference first.
1176823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon     *
1177823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon     * @param conference The conference.
1178823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon     * @return {@code true} if the conference was successfully set.
1179823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon     * @hide
1180823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon     */
1181823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon    public final boolean setConference(Conference conference) {
11825c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        checkImmutable();
1183823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon        // We check to see if it is already part of another conference.
11840159ac0cfe20e8f85ee4150e64d91392850f8a3fSantos Cordon        if (mConference == null) {
1185823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon            mConference = conference;
11860159ac0cfe20e8f85ee4150e64d91392850f8a3fSantos Cordon            if (mConnectionService != null && mConnectionService.containsConference(conference)) {
11870159ac0cfe20e8f85ee4150e64d91392850f8a3fSantos Cordon                fireConferenceChanged();
11880159ac0cfe20e8f85ee4150e64d91392850f8a3fSantos Cordon            }
1189823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon            return true;
1190823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon        }
1191823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon        return false;
1192823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon    }
1193823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon
1194823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon    /**
1195823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon     * Resets the conference that this connection is a part of.
1196823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon     * @hide
1197823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon     */
1198823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon    public final void resetConference() {
1199823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon        if (mConference != null) {
12000159ac0cfe20e8f85ee4150e64d91392850f8a3fSantos Cordon            Log.d(this, "Conference reset");
1201823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon            mConference = null;
1202823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon            fireConferenceChanged();
1203823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon        }
1204823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon    }
1205823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon
1206b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad    /**
1207b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad     * Notifies this Connection that the {@link #getAudioState()} property has a new value.
1208400cc48512dc69e940ad4d233a3b47ee9574601dSailesh Nepal     *
12095c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * @param state The new connection audio state.
1210400cc48512dc69e940ad4d233a3b47ee9574601dSailesh Nepal     */
1211354b2bd0fe8647bd5c7e28f3598b9b7414846124Nancy Chen    public void onAudioStateChanged(AudioState state) {}
1212400cc48512dc69e940ad4d233a3b47ee9574601dSailesh Nepal
1213400cc48512dc69e940ad4d233a3b47ee9574601dSailesh Nepal    /**
1214bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton     * Notifies this Connection of an internal state change. This method is called after the
1215bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton     * state is changed.
1216f835897f9f799490de27653ae39141ba6bc14223Ihab Awad     *
1217b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad     * @param state The new state, one of the {@code STATE_*} constants.
1218f835897f9f799490de27653ae39141ba6bc14223Ihab Awad     */
1219354b2bd0fe8647bd5c7e28f3598b9b7414846124Nancy Chen    public void onStateChanged(int state) {}
1220f835897f9f799490de27653ae39141ba6bc14223Ihab Awad
1221f835897f9f799490de27653ae39141ba6bc14223Ihab Awad    /**
1222542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     * Notifies this Connection of a request to play a DTMF tone.
1223542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     *
1224542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     * @param c A DTMF character.
1225542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     */
1226f29511043e1c3bf750e28427410192c793363bf7Santos Cordon    public void onPlayDtmfTone(char c) {}
1227542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad
1228542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad    /**
1229542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     * Notifies this Connection of a request to stop any currently playing DTMF tones.
1230542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     */
1231f29511043e1c3bf750e28427410192c793363bf7Santos Cordon    public void onStopDtmfTone() {}
1232542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad
1233542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad    /**
1234542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     * Notifies this Connection of a request to disconnect.
1235542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     */
1236f29511043e1c3bf750e28427410192c793363bf7Santos Cordon    public void onDisconnect() {}
1237542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad
1238542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad    /**
12393b4b1dcb607b8932374a4bc8c9ab349b9bb68660Tyler Gunn     * Notifies this Connection of a request to disconnect a participant of the conference managed
12403b4b1dcb607b8932374a4bc8c9ab349b9bb68660Tyler Gunn     * by the connection.
12413b4b1dcb607b8932374a4bc8c9ab349b9bb68660Tyler Gunn     *
12423b4b1dcb607b8932374a4bc8c9ab349b9bb68660Tyler Gunn     * @param endpoint the {@link Uri} of the participant to disconnect.
12433b4b1dcb607b8932374a4bc8c9ab349b9bb68660Tyler Gunn     * @hide
12443b4b1dcb607b8932374a4bc8c9ab349b9bb68660Tyler Gunn     */
12453b4b1dcb607b8932374a4bc8c9ab349b9bb68660Tyler Gunn    public void onDisconnectConferenceParticipant(Uri endpoint) {}
12463b4b1dcb607b8932374a4bc8c9ab349b9bb68660Tyler Gunn
12473b4b1dcb607b8932374a4bc8c9ab349b9bb68660Tyler Gunn    /**
12487c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon     * Notifies this Connection of a request to separate from its parent conference.
1249b693998fdfdd4498a33c4c69405f2708e4840aa7Santos Cordon     */
1250f29511043e1c3bf750e28427410192c793363bf7Santos Cordon    public void onSeparate() {}
1251b693998fdfdd4498a33c4c69405f2708e4840aa7Santos Cordon
1252b693998fdfdd4498a33c4c69405f2708e4840aa7Santos Cordon    /**
1253542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     * Notifies this Connection of a request to abort.
1254542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     */
1255f29511043e1c3bf750e28427410192c793363bf7Santos Cordon    public void onAbort() {}
1256542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad
1257542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad    /**
1258542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     * Notifies this Connection of a request to hold.
1259542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     */
1260f29511043e1c3bf750e28427410192c793363bf7Santos Cordon    public void onHold() {}
1261542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad
1262542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad    /**
1263542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     * Notifies this Connection of a request to exit a hold state.
1264542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     */
1265f29511043e1c3bf750e28427410192c793363bf7Santos Cordon    public void onUnhold() {}
1266542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad
1267542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad    /**
1268b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad     * Notifies this Connection, which is in {@link #STATE_RINGING}, of
1269d34e5713c9571859d12e9c2e83ce3946cacdd68eSantos Cordon     * a request to accept.
12708da4c3c11faf066b2b04ba853f03be6f1c4af5d8Andrew Lee     *
12715c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * @param videoState The video state in which to answer the connection.
1272be74de0978a7eaa577f6b61902b550a3161aff8bTyler Gunn     * @hide
1273542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     */
1274f29511043e1c3bf750e28427410192c793363bf7Santos Cordon    public void onAnswer(int videoState) {}
1275542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad
1276542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad    /**
1277b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad     * Notifies this Connection, which is in {@link #STATE_RINGING}, of
1278be74de0978a7eaa577f6b61902b550a3161aff8bTyler Gunn     * a request to accept.
1279be74de0978a7eaa577f6b61902b550a3161aff8bTyler Gunn     */
1280be74de0978a7eaa577f6b61902b550a3161aff8bTyler Gunn    public void onAnswer() {
1281be74de0978a7eaa577f6b61902b550a3161aff8bTyler Gunn        onAnswer(VideoProfile.VideoState.AUDIO_ONLY);
1282be74de0978a7eaa577f6b61902b550a3161aff8bTyler Gunn    }
1283be74de0978a7eaa577f6b61902b550a3161aff8bTyler Gunn
1284be74de0978a7eaa577f6b61902b550a3161aff8bTyler Gunn    /**
1285be74de0978a7eaa577f6b61902b550a3161aff8bTyler Gunn     * Notifies this Connection, which is in {@link #STATE_RINGING}, of
1286d34e5713c9571859d12e9c2e83ce3946cacdd68eSantos Cordon     * a request to reject.
1287542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     */
1288f29511043e1c3bf750e28427410192c793363bf7Santos Cordon    public void onReject() {}
1289542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad
12906dea4aceba8f69ee4be346ec356d277a3c153f3dEvan Charlton    /**
12916dea4aceba8f69ee4be346ec356d277a3c153f3dEvan Charlton     * Notifies this Connection whether the user wishes to proceed with the post-dial DTMF codes.
12926dea4aceba8f69ee4be346ec356d277a3c153f3dEvan Charlton     */
1293f29511043e1c3bf750e28427410192c793363bf7Santos Cordon    public void onPostDialContinue(boolean proceed) {}
12946dea4aceba8f69ee4be346ec356d277a3c153f3dEvan Charlton
1295b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad    static String toLogSafePhoneNumber(String number) {
1296b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        // For unknown number, log empty string.
1297b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        if (number == null) {
1298b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            return "";
1299b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        }
1300b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
1301b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        if (PII_DEBUG) {
1302b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            // When PII_DEBUG is true we emit PII.
1303b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            return number;
1304b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        }
1305b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
1306b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        // Do exactly same thing as Uri#toSafeString() does, which will enable us to compare
1307b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        // sanitized phone numbers.
1308b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        StringBuilder builder = new StringBuilder();
1309b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        for (int i = 0; i < number.length(); i++) {
1310b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            char c = number.charAt(i);
1311b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            if (c == '-' || c == '@' || c == '.') {
1312b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                builder.append(c);
1313b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            } else {
1314b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                builder.append('x');
1315b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            }
1316b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        }
1317b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        return builder.toString();
1318b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad    }
1319b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
1320542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad    private void setState(int state) {
13215c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        checkImmutable();
13226107bab041fb7d851fbf865b7310d294aae970c8Ihab Awad        if (mState == STATE_DISCONNECTED && mState != state) {
13236107bab041fb7d851fbf865b7310d294aae970c8Ihab Awad            Log.d(this, "Connection already DISCONNECTED; cannot transition out of this state.");
1324bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton            return;
1325400cc48512dc69e940ad4d233a3b47ee9574601dSailesh Nepal        }
1326bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton        if (mState != state) {
1327bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton            Log.d(this, "setState: %s", stateToString(state));
1328bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton            mState = state;
1329354b2bd0fe8647bd5c7e28f3598b9b7414846124Nancy Chen            onStateChanged(state);
1330bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton            for (Listener l : mListeners) {
1331bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton                l.onStateChanged(this, state);
1332bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton            }
1333bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton        }
1334bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton    }
1335bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton
1336cf7020b7e84c1f5190db7167d70cb0675cd3332fSailesh Nepal    private static class FailureSignalingConnection extends Connection {
133790e34e324cbe22f18680809cbc33caf63b320cb4Ihab Awad        private boolean mImmutable = false;
13387f3d41fd124dd7c4a8b72c1d48df08a8ee7209ecAndrew Lee        public FailureSignalingConnection(DisconnectCause disconnectCause) {
13397f3d41fd124dd7c4a8b72c1d48df08a8ee7209ecAndrew Lee            setDisconnected(disconnectCause);
134090e34e324cbe22f18680809cbc33caf63b320cb4Ihab Awad            mImmutable = true;
13416107bab041fb7d851fbf865b7310d294aae970c8Ihab Awad        }
13425c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad
13435c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        public void checkImmutable() {
134490e34e324cbe22f18680809cbc33caf63b320cb4Ihab Awad            if (mImmutable) {
134590e34e324cbe22f18680809cbc33caf63b320cb4Ihab Awad                throw new UnsupportedOperationException("Connection is immutable");
134690e34e324cbe22f18680809cbc33caf63b320cb4Ihab Awad            }
13475c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        }
13486107bab041fb7d851fbf865b7310d294aae970c8Ihab Awad    }
13496107bab041fb7d851fbf865b7310d294aae970c8Ihab Awad
1350bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton    /**
13516107bab041fb7d851fbf865b7310d294aae970c8Ihab Awad     * Return a {@code Connection} which represents a failed connection attempt. The returned
13527f3d41fd124dd7c4a8b72c1d48df08a8ee7209ecAndrew Lee     * {@code Connection} will have a {@link android.telecom.DisconnectCause} and as specified,
13537f3d41fd124dd7c4a8b72c1d48df08a8ee7209ecAndrew Lee     * and a {@link #getState()} of {@link #STATE_DISCONNECTED}.
13546107bab041fb7d851fbf865b7310d294aae970c8Ihab Awad     * <p>
13556107bab041fb7d851fbf865b7310d294aae970c8Ihab Awad     * The returned {@code Connection} can be assumed to {@link #destroy()} itself when appropriate,
13566107bab041fb7d851fbf865b7310d294aae970c8Ihab Awad     * so users of this method need not maintain a reference to its return value to destroy it.
1357bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton     *
13587f3d41fd124dd7c4a8b72c1d48df08a8ee7209ecAndrew Lee     * @param disconnectCause The disconnect cause, ({@see android.telecomm.DisconnectCause}).
13596107bab041fb7d851fbf865b7310d294aae970c8Ihab Awad     * @return A {@code Connection} which indicates failure.
1360bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton     */
13617f3d41fd124dd7c4a8b72c1d48df08a8ee7209ecAndrew Lee    public static Connection createFailedConnection(DisconnectCause disconnectCause) {
13627f3d41fd124dd7c4a8b72c1d48df08a8ee7209ecAndrew Lee        return new FailureSignalingConnection(disconnectCause);
1363bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton    }
1364bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton
1365bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton    /**
13665c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * Override to throw an {@link UnsupportedOperationException} if this {@code Connection} is
13675c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * not intended to be mutated, e.g., if it is a marker for failure. Only for framework use;
13685c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * this should never be un-@hide-den.
13695c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     *
13705c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * @hide
13715c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     */
13725c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad    public void checkImmutable() {}
13735c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad
13745c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad    /**
13756107bab041fb7d851fbf865b7310d294aae970c8Ihab Awad     * Return a {@code Connection} which represents a canceled connection attempt. The returned
13766107bab041fb7d851fbf865b7310d294aae970c8Ihab Awad     * {@code Connection} will have state {@link #STATE_DISCONNECTED}, and cannot be moved out of
13776107bab041fb7d851fbf865b7310d294aae970c8Ihab Awad     * that state. This connection should not be used for anything, and no other
13786107bab041fb7d851fbf865b7310d294aae970c8Ihab Awad     * {@code Connection}s should be attempted.
13796107bab041fb7d851fbf865b7310d294aae970c8Ihab Awad     * <p>
13806107bab041fb7d851fbf865b7310d294aae970c8Ihab Awad     * so users of this method need not maintain a reference to its return value to destroy it.
1381bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton     *
13825c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * @return A {@code Connection} which indicates that the underlying connection should
13835c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * be canceled.
1384bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton     */
1385b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad    public static Connection createCanceledConnection() {
13867f3d41fd124dd7c4a8b72c1d48df08a8ee7209ecAndrew Lee        return new FailureSignalingConnection(new DisconnectCause(DisconnectCause.CANCELED));
1387542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad    }
13887c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon
13895c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad    private final void fireOnConferenceableConnectionsChanged() {
13907c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon        for (Listener l : mListeners) {
13916d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn            l.onConferenceablesChanged(this, getConferenceables());
13927c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon        }
13937c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon    }
13947c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon
1395823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon    private final void fireConferenceChanged() {
1396823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon        for (Listener l : mListeners) {
1397823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon            l.onConferenceChanged(this, mConference);
1398823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon        }
1399823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon    }
1400823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon
14017c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon    private final void clearConferenceableList() {
14026d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn        for (IConferenceable c : mConferenceables) {
14036d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn            if (c instanceof Connection) {
14046d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn                Connection connection = (Connection) c;
14056d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn                connection.removeConnectionListener(mConnectionDeathListener);
14066d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn            } else if (c instanceof Conference) {
14076d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn                Conference conference = (Conference) c;
14086d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn                conference.removeListener(mConferenceDeathListener);
14096d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn            }
14107c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon        }
14116d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn        mConferenceables.clear();
14127c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon    }
14133bffcf78b5e4bd8b60543126fc0bdb09808f28f5Tyler Gunn
14143bffcf78b5e4bd8b60543126fc0bdb09808f28f5Tyler Gunn    /**
1415ab4650c4563cd46e65ac37f924fee8febfd759c6Tyler Gunn     * Notifies listeners of a change to conference participant(s).
14163bffcf78b5e4bd8b60543126fc0bdb09808f28f5Tyler Gunn     *
1417ab4650c4563cd46e65ac37f924fee8febfd759c6Tyler Gunn     * @param conferenceParticipants The participants.
14183bffcf78b5e4bd8b60543126fc0bdb09808f28f5Tyler Gunn     * @hide
14193bffcf78b5e4bd8b60543126fc0bdb09808f28f5Tyler Gunn     */
1420ab4650c4563cd46e65ac37f924fee8febfd759c6Tyler Gunn    protected final void updateConferenceParticipants(
1421ab4650c4563cd46e65ac37f924fee8febfd759c6Tyler Gunn            List<ConferenceParticipant> conferenceParticipants) {
14223bffcf78b5e4bd8b60543126fc0bdb09808f28f5Tyler Gunn        for (Listener l : mListeners) {
1423ab4650c4563cd46e65ac37f924fee8febfd759c6Tyler Gunn            l.onConferenceParticipantsChanged(this, conferenceParticipants);
14243bffcf78b5e4bd8b60543126fc0bdb09808f28f5Tyler Gunn        }
14253bffcf78b5e4bd8b60543126fc0bdb09808f28f5Tyler Gunn    }
14268a2b1199a6db0c6f2493e96e25ec1d89e3f62769Tyler Gunn
14278a2b1199a6db0c6f2493e96e25ec1d89e3f62769Tyler Gunn    /**
14288a2b1199a6db0c6f2493e96e25ec1d89e3f62769Tyler Gunn     * Notifies listeners that a conference call has been started.
14298a2b1199a6db0c6f2493e96e25ec1d89e3f62769Tyler Gunn     */
14308a2b1199a6db0c6f2493e96e25ec1d89e3f62769Tyler Gunn    protected void notifyConferenceStarted() {
14318a2b1199a6db0c6f2493e96e25ec1d89e3f62769Tyler Gunn        for (Listener l : mListeners) {
14328a2b1199a6db0c6f2493e96e25ec1d89e3f62769Tyler Gunn            l.onConferenceStarted();
14338a2b1199a6db0c6f2493e96e25ec1d89e3f62769Tyler Gunn        }
14348a2b1199a6db0c6f2493e96e25ec1d89e3f62769Tyler Gunn    }
1435542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad}
1436