Connection.java revision ef77f0ed78db3cfa098a26d6186abbd59c5cfd15
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    /**
1215c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * Connection is using voice over LTE.
1225c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * @hide
1235c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     */
1245c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad    public static final int CAPABILITY_VoLTE = 0x00000400;
1255c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad
1265c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad    /**
1275c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * Connection is using voice over WIFI.
1285c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * @hide
1295c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     */
1305c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad    public static final int CAPABILITY_VoWIFI = 0x00000800;
1315c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad
1325c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad    /**
1335c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * Connection is able to be separated from its parent {@code Conference}, if any.
1345c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     */
1355c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad    public static final int CAPABILITY_SEPARATE_FROM_CONFERENCE = 0x00001000;
1365c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad
1375c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad    /**
1385c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * Connection is able to be individually disconnected when in a {@code Conference}.
1395c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     */
1405c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad    public static final int CAPABILITY_DISCONNECT_FROM_CONFERENCE = 0x00002000;
1415c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad
1425c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad    /**
1435c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * Whether the call is a generic conference, where we do not know the precise state of
1445c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * participants in the conference (eg. on CDMA).
1455c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     *
1465c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * @hide
1475c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     */
1485c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad    public static final int CAPABILITY_GENERIC_CONFERENCE = 0x00004000;
1495c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad
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        }
2275c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        if (can(capabilities, CAPABILITY_VoLTE)) {
2285c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad            builder.append(" CAPABILITY_VoLTE");
2295c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        }
2305c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        if (can(capabilities, CAPABILITY_VoWIFI)) {
2315c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad            builder.append(" CAPABILITY_VoWIFI");
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) {}
249100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee        public void onRingbackRequested(Connection c, boolean ringback) {}
250612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepal        public void onDestroyed(Connection c) {}
2515c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        public void onConnectionCapabilitiesChanged(Connection c, int capabilities) {}
252b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        public void onVideoProviderChanged(
253b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                Connection c, VideoProvider videoProvider) {}
254001bbbb239d4ef1005a87039c7c53e26d8f13ad6Sailesh Nepal        public void onAudioModeIsVoipChanged(Connection c, boolean isVoip) {}
255001bbbb239d4ef1005a87039c7c53e26d8f13ad6Sailesh Nepal        public void onStatusHintsChanged(Connection c, StatusHints statusHints) {}
2566d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn        public void onConferenceablesChanged(
2576d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn                Connection c, List<IConferenceable> conferenceables) {}
258823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon        public void onConferenceChanged(Connection c, Conference conference) {}
2593bffcf78b5e4bd8b60543126fc0bdb09808f28f5Tyler Gunn        /** @hide */
260ab4650c4563cd46e65ac37f924fee8febfd759c6Tyler Gunn        public void onConferenceParticipantsChanged(Connection c,
261ab4650c4563cd46e65ac37f924fee8febfd759c6Tyler Gunn                List<ConferenceParticipant> participants) {}
262542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad    }
263542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad
26427d1e257f3cba2d5954e5562db69035df9ecf290Tyler Gunn    /** @hide */
265b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad    public static abstract class VideoProvider {
266b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
267b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        /**
268b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * Video is not being received (no protocol pause was issued).
269b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         */
270b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        public static final int SESSION_EVENT_RX_PAUSE = 1;
271b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
272b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        /**
273b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * Video reception has resumed after a SESSION_EVENT_RX_PAUSE.
274b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         */
275b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        public static final int SESSION_EVENT_RX_RESUME = 2;
276b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
277b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        /**
278b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * Video transmission has begun. This occurs after a negotiated start of video transmission
279b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * when the underlying protocol has actually begun transmitting video to the remote party.
280b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         */
281b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        public static final int SESSION_EVENT_TX_START = 3;
282b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
283b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        /**
284b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * Video transmission has stopped. This occurs after a negotiated stop of video transmission
285b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * when the underlying protocol has actually stopped transmitting video to the remote party.
286b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         */
287b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        public static final int SESSION_EVENT_TX_STOP = 4;
288b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
289b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        /**
290b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * A camera failure has occurred for the selected camera.  The In-Call UI can use this as a
291b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * cue to inform the user the camera is not available.
292b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         */
293b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        public static final int SESSION_EVENT_CAMERA_FAILURE = 5;
294b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
295b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        /**
296b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * Issued after {@code SESSION_EVENT_CAMERA_FAILURE} when the camera is once again ready for
297b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * operation.  The In-Call UI can use this as a cue to inform the user that the camera has
298b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * become available again.
299b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         */
300b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        public static final int SESSION_EVENT_CAMERA_READY = 6;
301b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
302b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        /**
303b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * Session modify request was successful.
304b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         */
305b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        public static final int SESSION_MODIFY_REQUEST_SUCCESS = 1;
306b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
307b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        /**
308b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * Session modify request failed.
309b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         */
310b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        public static final int SESSION_MODIFY_REQUEST_FAIL = 2;
311b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
312b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        /**
313b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * Session modify request ignored due to invalid parameters.
314b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         */
315b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        public static final int SESSION_MODIFY_REQUEST_INVALID = 3;
316b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
317a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad        private static final int MSG_SET_VIDEO_CALLBACK = 1;
318b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        private static final int MSG_SET_CAMERA = 2;
319b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        private static final int MSG_SET_PREVIEW_SURFACE = 3;
320b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        private static final int MSG_SET_DISPLAY_SURFACE = 4;
321b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        private static final int MSG_SET_DEVICE_ORIENTATION = 5;
322b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        private static final int MSG_SET_ZOOM = 6;
323b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        private static final int MSG_SEND_SESSION_MODIFY_REQUEST = 7;
324b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        private static final int MSG_SEND_SESSION_MODIFY_RESPONSE = 8;
325b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        private static final int MSG_REQUEST_CAMERA_CAPABILITIES = 9;
3265c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        private static final int MSG_REQUEST_CONNECTION_DATA_USAGE = 10;
327b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        private static final int MSG_SET_PAUSE_IMAGE = 11;
328b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
329b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        private final VideoProvider.VideoProviderHandler
330b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                mMessageHandler = new VideoProvider.VideoProviderHandler();
331b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        private final VideoProvider.VideoProviderBinder mBinder;
332a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad        private IVideoCallback mVideoCallback;
333b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
334b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        /**
335b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * Default handler used to consolidate binder method calls onto a single thread.
336b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         */
337b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        private final class VideoProviderHandler extends Handler {
338b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            @Override
339b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            public void handleMessage(Message msg) {
340b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                switch (msg.what) {
341a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad                    case MSG_SET_VIDEO_CALLBACK:
342a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad                        mVideoCallback = IVideoCallback.Stub.asInterface((IBinder) msg.obj);
343b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                        break;
344b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                    case MSG_SET_CAMERA:
345b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                        onSetCamera((String) msg.obj);
346b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                        break;
347b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                    case MSG_SET_PREVIEW_SURFACE:
348b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                        onSetPreviewSurface((Surface) msg.obj);
349b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                        break;
350b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                    case MSG_SET_DISPLAY_SURFACE:
351b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                        onSetDisplaySurface((Surface) msg.obj);
352b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                        break;
353b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                    case MSG_SET_DEVICE_ORIENTATION:
354b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                        onSetDeviceOrientation(msg.arg1);
355b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                        break;
356b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                    case MSG_SET_ZOOM:
357b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                        onSetZoom((Float) msg.obj);
358b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                        break;
359b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                    case MSG_SEND_SESSION_MODIFY_REQUEST:
360b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                        onSendSessionModifyRequest((VideoProfile) msg.obj);
361b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                        break;
362b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                    case MSG_SEND_SESSION_MODIFY_RESPONSE:
363b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                        onSendSessionModifyResponse((VideoProfile) msg.obj);
364b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                        break;
365b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                    case MSG_REQUEST_CAMERA_CAPABILITIES:
366b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                        onRequestCameraCapabilities();
367b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                        break;
3685c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad                    case MSG_REQUEST_CONNECTION_DATA_USAGE:
3695c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad                        onRequestConnectionDataUsage();
370b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                        break;
371b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                    case MSG_SET_PAUSE_IMAGE:
372b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                        onSetPauseImage((String) msg.obj);
373b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                        break;
374b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                    default:
375b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                        break;
376b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                }
377b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            }
378b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        }
379b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
380b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        /**
381b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * IVideoProvider stub implementation.
382b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         */
383b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        private final class VideoProviderBinder extends IVideoProvider.Stub {
384a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad            public void setVideoCallback(IBinder videoCallbackBinder) {
385b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                mMessageHandler.obtainMessage(
386a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad                        MSG_SET_VIDEO_CALLBACK, videoCallbackBinder).sendToTarget();
387b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            }
388b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
389b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            public void setCamera(String cameraId) {
390b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                mMessageHandler.obtainMessage(MSG_SET_CAMERA, cameraId).sendToTarget();
391b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            }
392b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
393b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            public void setPreviewSurface(Surface surface) {
394b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                mMessageHandler.obtainMessage(MSG_SET_PREVIEW_SURFACE, surface).sendToTarget();
395b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            }
396b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
397b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            public void setDisplaySurface(Surface surface) {
398b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                mMessageHandler.obtainMessage(MSG_SET_DISPLAY_SURFACE, surface).sendToTarget();
399b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            }
400b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
401b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            public void setDeviceOrientation(int rotation) {
402b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                mMessageHandler.obtainMessage(MSG_SET_DEVICE_ORIENTATION, rotation).sendToTarget();
403b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            }
404b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
405b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            public void setZoom(float value) {
406b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                mMessageHandler.obtainMessage(MSG_SET_ZOOM, value).sendToTarget();
407b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            }
408b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
409b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            public void sendSessionModifyRequest(VideoProfile requestProfile) {
410b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                mMessageHandler.obtainMessage(
411b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                        MSG_SEND_SESSION_MODIFY_REQUEST, requestProfile).sendToTarget();
412b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            }
413b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
414b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            public void sendSessionModifyResponse(VideoProfile responseProfile) {
415b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                mMessageHandler.obtainMessage(
416b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                        MSG_SEND_SESSION_MODIFY_RESPONSE, responseProfile).sendToTarget();
417b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            }
418b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
419b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            public void requestCameraCapabilities() {
420b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                mMessageHandler.obtainMessage(MSG_REQUEST_CAMERA_CAPABILITIES).sendToTarget();
421b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            }
422b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
423b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            public void requestCallDataUsage() {
4245c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad                mMessageHandler.obtainMessage(MSG_REQUEST_CONNECTION_DATA_USAGE).sendToTarget();
425b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            }
426b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
427b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            public void setPauseImage(String uri) {
428b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                mMessageHandler.obtainMessage(MSG_SET_PAUSE_IMAGE, uri).sendToTarget();
429b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            }
430b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        }
431b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
432b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        public VideoProvider() {
433b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            mBinder = new VideoProvider.VideoProviderBinder();
434b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        }
435b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
436b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        /**
437b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * Returns binder object which can be used across IPC methods.
438b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * @hide
439b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         */
440b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        public final IVideoProvider getInterface() {
441b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            return mBinder;
442b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        }
443b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
444b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        /**
4455c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad         * Sets the camera to be used for video recording in a video connection.
446b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         *
447b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * @param cameraId The id of the camera.
448b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         */
449b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        public abstract void onSetCamera(String cameraId);
450b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
451b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        /**
452b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * Sets the surface to be used for displaying a preview of what the user's camera is
453b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * currently capturing.  When video transmission is enabled, this is the video signal which
454b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * is sent to the remote device.
455b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         *
456b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * @param surface The surface.
457b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         */
458b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        public abstract void onSetPreviewSurface(Surface surface);
459b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
460b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        /**
461b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * Sets the surface to be used for displaying the video received from the remote device.
462b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         *
463b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * @param surface The surface.
464b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         */
465b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        public abstract void onSetDisplaySurface(Surface surface);
466b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
467b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        /**
468b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * Sets the device orientation, in degrees.  Assumes that a standard portrait orientation of
469b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * the device is 0 degrees.
470b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         *
471b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * @param rotation The device orientation, in degrees.
472b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         */
473b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        public abstract void onSetDeviceOrientation(int rotation);
474b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
475b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        /**
476b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * Sets camera zoom ratio.
477b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         *
478b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * @param value The camera zoom ratio.
479b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         */
480b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        public abstract void onSetZoom(float value);
481b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
482b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        /**
483b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * Issues a request to modify the properties of the current session.  The request is
484b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * sent to the remote device where it it handled by the In-Call UI.
4855c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad         * Some examples of session modification requests: upgrade connection from audio to video,
4865c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad         * downgrade connection from video to audio, pause video.
487b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         *
4885c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad         * @param requestProfile The requested connection video properties.
489b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         */
490b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        public abstract void onSendSessionModifyRequest(VideoProfile requestProfile);
491b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
492b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        /**te
4935c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad         * Provides a response to a request to change the current connection session video
494b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * properties.
495b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * This is in response to a request the InCall UI has received via the InCall UI.
496b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         *
4975c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad         * @param responseProfile The response connection video properties.
498b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         */
499b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        public abstract void onSendSessionModifyResponse(VideoProfile responseProfile);
500b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
501b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        /**
502b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * Issues a request to the video provider to retrieve the camera capabilities.
503b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * Camera capabilities are reported back to the caller via the In-Call UI.
504b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         */
505b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        public abstract void onRequestCameraCapabilities();
506b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
507b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        /**
508b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * Issues a request to the video telephony framework to retrieve the cumulative data usage
5095c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad         * for the current connection.  Data usage is reported back to the caller via the
510b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * InCall UI.
511b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         */
5125c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        public abstract void onRequestConnectionDataUsage();
513b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
514b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        /**
515b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * Provides the video telephony framework with the URI of an image to be displayed to remote
516b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * devices when the video signal is paused.
517b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         *
518b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * @param uri URI of image to display.
519b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         */
520b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        public abstract void onSetPauseImage(String uri);
521b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
522b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        /**
523b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * Invokes callback method defined in In-Call UI.
524b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         *
5255c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad         * @param videoProfile The requested video connection profile.
526b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         */
527b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        public void receiveSessionModifyRequest(VideoProfile videoProfile) {
528a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad            if (mVideoCallback != null) {
529b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                try {
530a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad                    mVideoCallback.receiveSessionModifyRequest(videoProfile);
531b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                } catch (RemoteException ignored) {
532b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                }
533b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            }
534b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        }
535b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
536b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        /**
537b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * Invokes callback method defined in In-Call UI.
538b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         *
539b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * @param status Status of the session modify request.  Valid values are
540b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         *               {@link VideoProvider#SESSION_MODIFY_REQUEST_SUCCESS},
541b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         *               {@link VideoProvider#SESSION_MODIFY_REQUEST_FAIL},
542b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         *               {@link VideoProvider#SESSION_MODIFY_REQUEST_INVALID}
543b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * @param requestedProfile The original request which was sent to the remote device.
544b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * @param responseProfile The actual profile changes made by the remote device.
545b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         */
546b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        public void receiveSessionModifyResponse(int status,
547b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                VideoProfile requestedProfile, VideoProfile responseProfile) {
548a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad            if (mVideoCallback != null) {
549b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                try {
550a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad                    mVideoCallback.receiveSessionModifyResponse(
551b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                            status, requestedProfile, responseProfile);
552b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                } catch (RemoteException ignored) {
553b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                }
554b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            }
555b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        }
556542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad
557b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        /**
558b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * Invokes callback method defined in In-Call UI.
559b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         *
560b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * Valid values are: {@link VideoProvider#SESSION_EVENT_RX_PAUSE},
561b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * {@link VideoProvider#SESSION_EVENT_RX_RESUME},
562b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * {@link VideoProvider#SESSION_EVENT_TX_START},
563b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * {@link VideoProvider#SESSION_EVENT_TX_STOP}
564b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         *
565b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * @param event The event.
566b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         */
567b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        public void handleCallSessionEvent(int event) {
568a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad            if (mVideoCallback != null) {
569b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                try {
570a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad                    mVideoCallback.handleCallSessionEvent(event);
571b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                } catch (RemoteException ignored) {
572b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                }
573b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            }
574b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        }
575b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
576b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        /**
577b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * Invokes callback method defined in In-Call UI.
578b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         *
579b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * @param width  The updated peer video width.
580b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * @param height The updated peer video height.
581b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         */
582b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        public void changePeerDimensions(int width, int height) {
583a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad            if (mVideoCallback != null) {
584b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                try {
585a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad                    mVideoCallback.changePeerDimensions(width, height);
586b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                } catch (RemoteException ignored) {
587b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                }
588b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            }
589b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        }
590bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton
591b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        /**
592b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * Invokes callback method defined in In-Call UI.
593b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         *
594b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * @param dataUsage The updated data usage.
595b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         */
596b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        public void changeCallDataUsage(int dataUsage) {
597a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad            if (mVideoCallback != null) {
598b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                try {
599a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad                    mVideoCallback.changeCallDataUsage(dataUsage);
600b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                } catch (RemoteException ignored) {
601b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                }
602b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            }
603b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        }
604b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
605b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        /**
606b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * Invokes callback method defined in In-Call UI.
607b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         *
608b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * @param cameraCapabilities The changed camera capabilities.
609b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         */
610b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        public void changeCameraCapabilities(CameraCapabilities cameraCapabilities) {
611a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad            if (mVideoCallback != null) {
612b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                try {
613a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad                    mVideoCallback.changeCameraCapabilities(cameraCapabilities);
614b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                } catch (RemoteException ignored) {
615b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                }
616b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            }
617b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        }
618542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad    }
619542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad
6207c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon    private final Listener mConnectionDeathListener = new Listener() {
6217c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon        @Override
6227c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon        public void onDestroyed(Connection c) {
6236d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn            if (mConferenceables.remove(c)) {
6246d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn                fireOnConferenceableConnectionsChanged();
6256d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn            }
6266d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn        }
6276d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn    };
6286d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn
6296d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn    private final Conference.Listener mConferenceDeathListener = new Conference.Listener() {
6306d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn        @Override
6316d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn        public void onDestroyed(Conference c) {
6326d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn            if (mConferenceables.remove(c)) {
6337c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon                fireOnConferenceableConnectionsChanged();
6347c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon            }
6357c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon        }
6367c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon    };
6377c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon
638229e3820dce98f64fd4834d5f421faec9a9d7026Jay Shrauner    /**
639229e3820dce98f64fd4834d5f421faec9a9d7026Jay Shrauner     * ConcurrentHashMap constructor params: 8 is initial table size, 0.9f is
640229e3820dce98f64fd4834d5f421faec9a9d7026Jay Shrauner     * load factor before resizing, 1 means we only expect a single thread to
641229e3820dce98f64fd4834d5f421faec9a9d7026Jay Shrauner     * access the map so make only a single shard
642229e3820dce98f64fd4834d5f421faec9a9d7026Jay Shrauner     */
643229e3820dce98f64fd4834d5f421faec9a9d7026Jay Shrauner    private final Set<Listener> mListeners = Collections.newSetFromMap(
644229e3820dce98f64fd4834d5f421faec9a9d7026Jay Shrauner            new ConcurrentHashMap<Listener, Boolean>(8, 0.9f, 1));
6456d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn    private final List<IConferenceable> mConferenceables = new ArrayList<>();
6466d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn    private final List<IConferenceable> mUnmodifiableConferenceables =
6476d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn            Collections.unmodifiableList(mConferenceables);
648b693998fdfdd4498a33c4c69405f2708e4840aa7Santos Cordon
649b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad    private int mState = STATE_NEW;
650b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad    private AudioState mAudioState;
651100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee    private Uri mAddress;
652100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee    private int mAddressPresentation;
653612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepal    private String mCallerDisplayName;
654612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepal    private int mCallerDisplayNamePresentation;
655100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee    private boolean mRingbackRequested = false;
6565c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad    private int mConnectionCapabilities;
657b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad    private VideoProvider mVideoProvider;
65833aaae4a07fdcce223fe74d96d751f4bffa6723aSailesh Nepal    private boolean mAudioModeIsVoip;
659e7ef59a77d55c9802cc7d919f7dd794bd5fea30eSailesh Nepal    private StatusHints mStatusHints;
660aa07df84f279a87ad6370758c9d792a660f2cebbTyler Gunn    private int mVideoState;
6617f3d41fd124dd7c4a8b72c1d48df08a8ee7209ecAndrew Lee    private DisconnectCause mDisconnectCause;
662823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon    private Conference mConference;
663823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon    private ConnectionService mConnectionService;
664542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad
665542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad    /**
666542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     * Create a new Connection.
667542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     */
668f29511043e1c3bf750e28427410192c793363bf7Santos Cordon    public Connection() {}
669542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad
670542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad    /**
671100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee     * @return The address (e.g., phone number) to which this Connection is currently communicating.
672542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     */
673100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee    public final Uri getAddress() {
674100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee        return mAddress;
675542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad    }
676542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad
677542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad    /**
678100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee     * @return The presentation requirements for the address.
679ef9f6f957d897ea0ed82114185b8fa3fefd4917bTyler Gunn     *         See {@link TelecomManager} for valid values.
680542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     */
681100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee    public final int getAddressPresentation() {
682100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee        return mAddressPresentation;
683612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepal    }
684612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepal
685612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepal    /**
686612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepal     * @return The caller display name (CNAP).
687612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepal     */
688612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepal    public final String getCallerDisplayName() {
689612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepal        return mCallerDisplayName;
690612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepal    }
691612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepal
692612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepal    /**
6939d568c01db1f90fbe9cbff1d9385e7e7b809e066Nancy Chen     * @return The presentation requirements for the handle.
694ef9f6f957d897ea0ed82114185b8fa3fefd4917bTyler Gunn     *         See {@link TelecomManager} for valid values.
695612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepal     */
696612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepal    public final int getCallerDisplayNamePresentation() {
697612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepal        return mCallerDisplayNamePresentation;
698542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad    }
699542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad
700542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad    /**
701612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepal     * @return The state of this Connection.
7028d83fa9bbd2ad15299a4419241eb10404e7839beTyler Gunn     */
703612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepal    public final int getState() {
704612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepal        return mState;
7052a46b90222e5c9c73de012382a604a71f9c0c30cSailesh Nepal    }
7068d83fa9bbd2ad15299a4419241eb10404e7839beTyler Gunn
7078d83fa9bbd2ad15299a4419241eb10404e7839beTyler Gunn    /**
7085c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * Returns the video state of the connection.
709b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad     * Valid values: {@link VideoProfile.VideoState#AUDIO_ONLY},
710b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad     * {@link VideoProfile.VideoState#BIDIRECTIONAL},
711b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad     * {@link VideoProfile.VideoState#TX_ENABLED},
712b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad     * {@link VideoProfile.VideoState#RX_ENABLED}.
713aa07df84f279a87ad6370758c9d792a660f2cebbTyler Gunn     *
7145c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * @return The video state of the connection.
71527d1e257f3cba2d5954e5562db69035df9ecf290Tyler Gunn     * @hide
716aa07df84f279a87ad6370758c9d792a660f2cebbTyler Gunn     */
717aa07df84f279a87ad6370758c9d792a660f2cebbTyler Gunn    public final int getVideoState() {
718aa07df84f279a87ad6370758c9d792a660f2cebbTyler Gunn        return mVideoState;
719aa07df84f279a87ad6370758c9d792a660f2cebbTyler Gunn    }
720aa07df84f279a87ad6370758c9d792a660f2cebbTyler Gunn
721aa07df84f279a87ad6370758c9d792a660f2cebbTyler Gunn    /**
7225c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * @return The audio state of the connection, describing how its audio is currently
723542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     *         being routed by the system. This is {@code null} if this Connection
724542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     *         does not directly know about its audio state.
725542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     */
726b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad    public final AudioState getAudioState() {
727b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        return mAudioState;
728542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad    }
729542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad
730542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad    /**
731823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon     * @return The conference that this connection is a part of.  Null if it is not part of any
732823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon     *         conference.
7332a46b90222e5c9c73de012382a604a71f9c0c30cSailesh Nepal     */
734823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon    public final Conference getConference() {
735823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon        return mConference;
7362a46b90222e5c9c73de012382a604a71f9c0c30cSailesh Nepal    }
7372a46b90222e5c9c73de012382a604a71f9c0c30cSailesh Nepal
7382a46b90222e5c9c73de012382a604a71f9c0c30cSailesh Nepal    /**
739823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon     * Returns whether this connection is requesting that the system play a ringback tone
740823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon     * on its behalf.
7412a46b90222e5c9c73de012382a604a71f9c0c30cSailesh Nepal     */
742100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee    public final boolean isRingbackRequested() {
743100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee        return mRingbackRequested;
7442a46b90222e5c9c73de012382a604a71f9c0c30cSailesh Nepal    }
7452a46b90222e5c9c73de012382a604a71f9c0c30cSailesh Nepal
7462a46b90222e5c9c73de012382a604a71f9c0c30cSailesh Nepal    /**
74733aaae4a07fdcce223fe74d96d751f4bffa6723aSailesh Nepal     * @return True if the connection's audio mode is VOIP.
74833aaae4a07fdcce223fe74d96d751f4bffa6723aSailesh Nepal     */
74933aaae4a07fdcce223fe74d96d751f4bffa6723aSailesh Nepal    public final boolean getAudioModeIsVoip() {
75033aaae4a07fdcce223fe74d96d751f4bffa6723aSailesh Nepal        return mAudioModeIsVoip;
75133aaae4a07fdcce223fe74d96d751f4bffa6723aSailesh Nepal    }
75233aaae4a07fdcce223fe74d96d751f4bffa6723aSailesh Nepal
75333aaae4a07fdcce223fe74d96d751f4bffa6723aSailesh Nepal    /**
754e7ef59a77d55c9802cc7d919f7dd794bd5fea30eSailesh Nepal     * @return The status hints for this connection.
755e7ef59a77d55c9802cc7d919f7dd794bd5fea30eSailesh Nepal     */
756e7ef59a77d55c9802cc7d919f7dd794bd5fea30eSailesh Nepal    public final StatusHints getStatusHints() {
757e7ef59a77d55c9802cc7d919f7dd794bd5fea30eSailesh Nepal        return mStatusHints;
758e7ef59a77d55c9802cc7d919f7dd794bd5fea30eSailesh Nepal    }
759e7ef59a77d55c9802cc7d919f7dd794bd5fea30eSailesh Nepal
760e7ef59a77d55c9802cc7d919f7dd794bd5fea30eSailesh Nepal    /**
761542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     * Assign a listener to be notified of state changes.
762542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     *
763542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     * @param l A listener.
764542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     * @return This Connection.
765542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     *
766542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     * @hide
767542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     */
768542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad    public final Connection addConnectionListener(Listener l) {
769d34e5713c9571859d12e9c2e83ce3946cacdd68eSantos Cordon        mListeners.add(l);
770542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad        return this;
771542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad    }
772542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad
773542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad    /**
774542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     * Remove a previously assigned listener that was being notified of state changes.
775542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     *
776542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     * @param l A Listener.
777542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     * @return This Connection.
778542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     *
779542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     * @hide
780542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     */
781542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad    public final Connection removeConnectionListener(Listener l) {
782229e3820dce98f64fd4834d5f421faec9a9d7026Jay Shrauner        if (l != null) {
783229e3820dce98f64fd4834d5f421faec9a9d7026Jay Shrauner            mListeners.remove(l);
784229e3820dce98f64fd4834d5f421faec9a9d7026Jay Shrauner        }
785542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad        return this;
786542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad    }
787542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad
788542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad    /**
789cf7020b7e84c1f5190db7167d70cb0675cd3332fSailesh Nepal     * @return The {@link DisconnectCause} for this connection.
790bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton     */
7917f3d41fd124dd7c4a8b72c1d48df08a8ee7209ecAndrew Lee    public final DisconnectCause getDisconnectCause() {
792cf7020b7e84c1f5190db7167d70cb0675cd3332fSailesh Nepal        return mDisconnectCause;
793bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton    }
794bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton
795bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton    /**
796542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     * Inform this Connection that the state of its audio output has been changed externally.
797542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     *
798542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     * @param state The new audio state.
799400cc48512dc69e940ad4d233a3b47ee9574601dSailesh Nepal     * @hide
800542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     */
801b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad    final void setAudioState(AudioState state) {
8025c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        checkImmutable();
80360ac30bb8a30fa7283d592c12ddf2da9447adf14Ihab Awad        Log.d(this, "setAudioState %s", state);
804b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        mAudioState = state;
805354b2bd0fe8647bd5c7e28f3598b9b7414846124Nancy Chen        onAudioStateChanged(state);
806542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad    }
807542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad
808542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad    /**
809b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad     * @param state An integer value of a {@code STATE_*} constant.
810542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     * @return A string representation of the value.
811542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     */
812542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad    public static String stateToString(int state) {
813542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad        switch (state) {
814b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            case STATE_INITIALIZING:
815b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                return "STATE_INITIALIZING";
816b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            case STATE_NEW:
817b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                return "STATE_NEW";
818b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            case STATE_RINGING:
819b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                return "STATE_RINGING";
820b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            case STATE_DIALING:
821b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                return "STATE_DIALING";
822b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            case STATE_ACTIVE:
823b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                return "STATE_ACTIVE";
824b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            case STATE_HOLDING:
825b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                return "STATE_HOLDING";
826b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            case STATE_DISCONNECTED:
827542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad                return "DISCONNECTED";
828542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad            default:
82960ac30bb8a30fa7283d592c12ddf2da9447adf14Ihab Awad                Log.wtf(Connection.class, "Unknown state %d", state);
830542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad                return "UNKNOWN";
831542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad        }
832542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad    }
833542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad
834542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad    /**
8355c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * Returns the connection's capabilities, as a bit mask of the {@code CAPABILITY_*} constants.
83652a28f619fca8c2118e1f421cb56f6542805e954Ihab Awad     */
8375c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad    public final int getConnectionCapabilities() {
8385c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        return mConnectionCapabilities;
83952a28f619fca8c2118e1f421cb56f6542805e954Ihab Awad    }
84052a28f619fca8c2118e1f421cb56f6542805e954Ihab Awad
841ef77f0ed78db3cfa098a26d6186abbd59c5cfd15Sailesh Nepal    /** @hide */
842ef77f0ed78db3cfa098a26d6186abbd59c5cfd15Sailesh Nepal    @SystemApi @Deprecated public final int getCallCapabilities() {
843ef77f0ed78db3cfa098a26d6186abbd59c5cfd15Sailesh Nepal        return getConnectionCapabilities();
844ef77f0ed78db3cfa098a26d6186abbd59c5cfd15Sailesh Nepal    }
845ef77f0ed78db3cfa098a26d6186abbd59c5cfd15Sailesh Nepal
84652a28f619fca8c2118e1f421cb56f6542805e954Ihab Awad    /**
847100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee     * Sets the value of the {@link #getAddress()} property.
848542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     *
849100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee     * @param address The new address.
850100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee     * @param presentation The presentation requirements for the address.
851ef9f6f957d897ea0ed82114185b8fa3fefd4917bTyler Gunn     *        See {@link TelecomManager} for valid values.
852542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     */
853100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee    public final void setAddress(Uri address, int presentation) {
8545c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        checkImmutable();
855100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee        Log.d(this, "setAddress %s", address);
856100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee        mAddress = address;
857100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee        mAddressPresentation = presentation;
858d34e5713c9571859d12e9c2e83ce3946cacdd68eSantos Cordon        for (Listener l : mListeners) {
859100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee            l.onAddressChanged(this, address, presentation);
860d34e5713c9571859d12e9c2e83ce3946cacdd68eSantos Cordon        }
861542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad    }
862542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad
863542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad    /**
864612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepal     * Sets the caller display name (CNAP).
8652a46b90222e5c9c73de012382a604a71f9c0c30cSailesh Nepal     *
866612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepal     * @param callerDisplayName The new display name.
8679d568c01db1f90fbe9cbff1d9385e7e7b809e066Nancy Chen     * @param presentation The presentation requirements for the handle.
868ef9f6f957d897ea0ed82114185b8fa3fefd4917bTyler Gunn     *        See {@link TelecomManager} for valid values.
869612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepal     */
870612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepal    public final void setCallerDisplayName(String callerDisplayName, int presentation) {
8715c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        checkImmutable();
872612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepal        Log.d(this, "setCallerDisplayName %s", callerDisplayName);
873d34e5713c9571859d12e9c2e83ce3946cacdd68eSantos Cordon        mCallerDisplayName = callerDisplayName;
874d34e5713c9571859d12e9c2e83ce3946cacdd68eSantos Cordon        mCallerDisplayNamePresentation = presentation;
875d34e5713c9571859d12e9c2e83ce3946cacdd68eSantos Cordon        for (Listener l : mListeners) {
876d34e5713c9571859d12e9c2e83ce3946cacdd68eSantos Cordon            l.onCallerDisplayNameChanged(this, callerDisplayName, presentation);
877d34e5713c9571859d12e9c2e83ce3946cacdd68eSantos Cordon        }
8782a46b90222e5c9c73de012382a604a71f9c0c30cSailesh Nepal    }
8792a46b90222e5c9c73de012382a604a71f9c0c30cSailesh Nepal
8802a46b90222e5c9c73de012382a604a71f9c0c30cSailesh Nepal    /**
881aa07df84f279a87ad6370758c9d792a660f2cebbTyler Gunn     * Set the video state for the connection.
882b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad     * Valid values: {@link VideoProfile.VideoState#AUDIO_ONLY},
883b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad     * {@link VideoProfile.VideoState#BIDIRECTIONAL},
884b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad     * {@link VideoProfile.VideoState#TX_ENABLED},
885b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad     * {@link VideoProfile.VideoState#RX_ENABLED}.
886aa07df84f279a87ad6370758c9d792a660f2cebbTyler Gunn     *
887aa07df84f279a87ad6370758c9d792a660f2cebbTyler Gunn     * @param videoState The new video state.
88827d1e257f3cba2d5954e5562db69035df9ecf290Tyler Gunn     * @hide
889aa07df84f279a87ad6370758c9d792a660f2cebbTyler Gunn     */
890aa07df84f279a87ad6370758c9d792a660f2cebbTyler Gunn    public final void setVideoState(int videoState) {
8915c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        checkImmutable();
892aa07df84f279a87ad6370758c9d792a660f2cebbTyler Gunn        Log.d(this, "setVideoState %d", videoState);
893d34e5713c9571859d12e9c2e83ce3946cacdd68eSantos Cordon        mVideoState = videoState;
894d34e5713c9571859d12e9c2e83ce3946cacdd68eSantos Cordon        for (Listener l : mListeners) {
895d34e5713c9571859d12e9c2e83ce3946cacdd68eSantos Cordon            l.onVideoStateChanged(this, mVideoState);
896d34e5713c9571859d12e9c2e83ce3946cacdd68eSantos Cordon        }
897aa07df84f279a87ad6370758c9d792a660f2cebbTyler Gunn    }
898aa07df84f279a87ad6370758c9d792a660f2cebbTyler Gunn
899aa07df84f279a87ad6370758c9d792a660f2cebbTyler Gunn    /**
9005c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * Sets state to active (e.g., an ongoing connection where two or more parties can actively
901542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     * communicate).
902542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     */
903400cc48512dc69e940ad4d233a3b47ee9574601dSailesh Nepal    public final void setActive() {
9045c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        checkImmutable();
905100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee        setRingbackRequested(false);
906b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        setState(STATE_ACTIVE);
907542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad    }
908542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad
909542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad    /**
9105c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * Sets state to ringing (e.g., an inbound ringing connection).
911542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     */
912400cc48512dc69e940ad4d233a3b47ee9574601dSailesh Nepal    public final void setRinging() {
9135c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        checkImmutable();
914b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        setState(STATE_RINGING);
915542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad    }
916542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad
917542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad    /**
918bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton     * Sets state to initializing (this Connection is not yet ready to be used).
919bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton     */
920bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton    public final void setInitializing() {
9215c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        checkImmutable();
922b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        setState(STATE_INITIALIZING);
923bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton    }
924bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton
925bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton    /**
926bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton     * Sets state to initialized (the Connection has been set up and is now ready to be used).
927bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton     */
928bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton    public final void setInitialized() {
9295c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        checkImmutable();
930b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        setState(STATE_NEW);
931bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton    }
932bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton
933bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton    /**
9345c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * Sets state to dialing (e.g., dialing an outbound connection).
935542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     */
936400cc48512dc69e940ad4d233a3b47ee9574601dSailesh Nepal    public final void setDialing() {
9375c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        checkImmutable();
938b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        setState(STATE_DIALING);
939542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad    }
940542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad
941542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad    /**
942542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     * Sets state to be on hold.
943542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     */
944400cc48512dc69e940ad4d233a3b47ee9574601dSailesh Nepal    public final void setOnHold() {
9455c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        checkImmutable();
946b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        setState(STATE_HOLDING);
947542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad    }
948542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad
949542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad    /**
9505c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * Sets the video connection provider.
951b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad     * @param videoProvider The video provider.
95227d1e257f3cba2d5954e5562db69035df9ecf290Tyler Gunn     * @hide
9535ffbe8b850c2703b64617f0140d051a5412dd861Andrew Lee     */
954b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad    public final void setVideoProvider(VideoProvider videoProvider) {
9555c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        checkImmutable();
956b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        mVideoProvider = videoProvider;
957d34e5713c9571859d12e9c2e83ce3946cacdd68eSantos Cordon        for (Listener l : mListeners) {
958b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            l.onVideoProviderChanged(this, videoProvider);
959d34e5713c9571859d12e9c2e83ce3946cacdd68eSantos Cordon        }
9605ffbe8b850c2703b64617f0140d051a5412dd861Andrew Lee    }
9615ffbe8b850c2703b64617f0140d051a5412dd861Andrew Lee
96227d1e257f3cba2d5954e5562db69035df9ecf290Tyler Gunn    /** @hide */
963b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad    public final VideoProvider getVideoProvider() {
964b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        return mVideoProvider;
965a27a1938ab27aeb17144867b231f830622fa6ad4Andrew Lee    }
966a27a1938ab27aeb17144867b231f830622fa6ad4Andrew Lee
9675ffbe8b850c2703b64617f0140d051a5412dd861Andrew Lee    /**
968091768c3021d740b7d66846d36405c4d4c76cc56Sailesh Nepal     * Sets state to disconnected.
969542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     *
9707f3d41fd124dd7c4a8b72c1d48df08a8ee7209ecAndrew Lee     * @param disconnectCause The reason for the disconnection, as specified by
971b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad     *         {@link DisconnectCause}.
972542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     */
9737f3d41fd124dd7c4a8b72c1d48df08a8ee7209ecAndrew Lee    public final void setDisconnected(DisconnectCause disconnectCause) {
9745c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        checkImmutable();
9757f3d41fd124dd7c4a8b72c1d48df08a8ee7209ecAndrew Lee        mDisconnectCause = disconnectCause;
976b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        setState(STATE_DISCONNECTED);
977f34519b4dd12d065c510b06922a196e8a3fd9885mike dooley        Log.d(this, "Disconnected with cause %s", disconnectCause);
978d34e5713c9571859d12e9c2e83ce3946cacdd68eSantos Cordon        for (Listener l : mListeners) {
9797f3d41fd124dd7c4a8b72c1d48df08a8ee7209ecAndrew Lee            l.onDisconnected(this, disconnectCause);
980d34e5713c9571859d12e9c2e83ce3946cacdd68eSantos Cordon        }
981542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad    }
982542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad
983542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad    /**
9845c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * Informs listeners that this {@code Connection} is in a post-dial wait state. This is done
9855c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * when (a) the {@code Connection} is issuing a DTMF sequence; (b) it has encountered a "wait"
9865c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * character; and (c) it wishes to inform the In-Call app that it is waiting for the end-user
9875c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * to send an {@link #onPostDialContinue(boolean)} signal.
9885c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     *
9895c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * @param remaining The DTMF character sequence remaining to be emitted once the
9905c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     *         {@link #onPostDialContinue(boolean)} is received, including any "wait" characters
9915c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     *         that remaining sequence may contain.
992091768c3021d740b7d66846d36405c4d4c76cc56Sailesh Nepal     */
993091768c3021d740b7d66846d36405c4d4c76cc56Sailesh Nepal    public final void setPostDialWait(String remaining) {
9945c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        checkImmutable();
995d34e5713c9571859d12e9c2e83ce3946cacdd68eSantos Cordon        for (Listener l : mListeners) {
996d34e5713c9571859d12e9c2e83ce3946cacdd68eSantos Cordon            l.onPostDialWait(this, remaining);
997d34e5713c9571859d12e9c2e83ce3946cacdd68eSantos Cordon        }
998091768c3021d740b7d66846d36405c4d4c76cc56Sailesh Nepal    }
999091768c3021d740b7d66846d36405c4d4c76cc56Sailesh Nepal
1000091768c3021d740b7d66846d36405c4d4c76cc56Sailesh Nepal    /**
1001f835897f9f799490de27653ae39141ba6bc14223Ihab Awad     * Requests that the framework play a ringback tone. This is to be invoked by implementations
10025c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * that do not play a ringback tone themselves in the connection's audio stream.
1003f835897f9f799490de27653ae39141ba6bc14223Ihab Awad     *
1004f835897f9f799490de27653ae39141ba6bc14223Ihab Awad     * @param ringback Whether the ringback tone is to be played.
1005f835897f9f799490de27653ae39141ba6bc14223Ihab Awad     */
1006100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee    public final void setRingbackRequested(boolean ringback) {
10075c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        checkImmutable();
1008100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee        if (mRingbackRequested != ringback) {
1009100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee            mRingbackRequested = ringback;
1010d34e5713c9571859d12e9c2e83ce3946cacdd68eSantos Cordon            for (Listener l : mListeners) {
1011100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee                l.onRingbackRequested(this, ringback);
1012d34e5713c9571859d12e9c2e83ce3946cacdd68eSantos Cordon            }
1013d34e5713c9571859d12e9c2e83ce3946cacdd68eSantos Cordon        }
1014f835897f9f799490de27653ae39141ba6bc14223Ihab Awad    }
1015f835897f9f799490de27653ae39141ba6bc14223Ihab Awad
10165c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad    /** @hide */
1017de06133569bb80bcfc182dd31d2348f006b79ff5Ihab Awad    @SystemApi @Deprecated public final void setCallCapabilities(int connectionCapabilities) {
10185c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        setConnectionCapabilities(connectionCapabilities);
10195c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad    }
10205c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad
1021f835897f9f799490de27653ae39141ba6bc14223Ihab Awad    /**
10225c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * Sets the connection's capabilities as a bit mask of the {@code CAPABILITY_*} constants.
10231a7061ba950538c93d92c0448752a212039cc06aSailesh Nepal     *
10245c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * @param connectionCapabilities The new connection capabilities.
1025b693998fdfdd4498a33c4c69405f2708e4840aa7Santos Cordon     */
10265c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad    public final void setConnectionCapabilities(int connectionCapabilities) {
10275c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        checkImmutable();
10285c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        if (mConnectionCapabilities != connectionCapabilities) {
10295c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad            mConnectionCapabilities = connectionCapabilities;
1030d34e5713c9571859d12e9c2e83ce3946cacdd68eSantos Cordon            for (Listener l : mListeners) {
10315c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad                l.onConnectionCapabilitiesChanged(this, mConnectionCapabilities);
1032d34e5713c9571859d12e9c2e83ce3946cacdd68eSantos Cordon            }
1033d34e5713c9571859d12e9c2e83ce3946cacdd68eSantos Cordon        }
1034b693998fdfdd4498a33c4c69405f2708e4840aa7Santos Cordon    }
1035b693998fdfdd4498a33c4c69405f2708e4840aa7Santos Cordon
1036b693998fdfdd4498a33c4c69405f2708e4840aa7Santos Cordon    /**
10377c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon     * Tears down the Connection object.
1038b693998fdfdd4498a33c4c69405f2708e4840aa7Santos Cordon     */
103936a713431ceda2e5462c5dc5d1300f32acf9e63aEvan Charlton    public final void destroy() {
1040229e3820dce98f64fd4834d5f421faec9a9d7026Jay Shrauner        for (Listener l : mListeners) {
1041229e3820dce98f64fd4834d5f421faec9a9d7026Jay Shrauner            l.onDestroyed(this);
1042d34e5713c9571859d12e9c2e83ce3946cacdd68eSantos Cordon        }
1043b693998fdfdd4498a33c4c69405f2708e4840aa7Santos Cordon    }
1044b693998fdfdd4498a33c4c69405f2708e4840aa7Santos Cordon
1045b693998fdfdd4498a33c4c69405f2708e4840aa7Santos Cordon    /**
104633aaae4a07fdcce223fe74d96d751f4bffa6723aSailesh Nepal     * Requests that the framework use VOIP audio mode for this connection.
104733aaae4a07fdcce223fe74d96d751f4bffa6723aSailesh Nepal     *
104833aaae4a07fdcce223fe74d96d751f4bffa6723aSailesh Nepal     * @param isVoip True if the audio mode is VOIP.
104933aaae4a07fdcce223fe74d96d751f4bffa6723aSailesh Nepal     */
105033aaae4a07fdcce223fe74d96d751f4bffa6723aSailesh Nepal    public final void setAudioModeIsVoip(boolean isVoip) {
10515c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        checkImmutable();
1052d34e5713c9571859d12e9c2e83ce3946cacdd68eSantos Cordon        mAudioModeIsVoip = isVoip;
1053d34e5713c9571859d12e9c2e83ce3946cacdd68eSantos Cordon        for (Listener l : mListeners) {
1054d34e5713c9571859d12e9c2e83ce3946cacdd68eSantos Cordon            l.onAudioModeIsVoipChanged(this, isVoip);
1055d34e5713c9571859d12e9c2e83ce3946cacdd68eSantos Cordon        }
105633aaae4a07fdcce223fe74d96d751f4bffa6723aSailesh Nepal    }
105733aaae4a07fdcce223fe74d96d751f4bffa6723aSailesh Nepal
105833aaae4a07fdcce223fe74d96d751f4bffa6723aSailesh Nepal    /**
1059e7ef59a77d55c9802cc7d919f7dd794bd5fea30eSailesh Nepal     * Sets the label and icon status to display in the in-call UI.
1060e7ef59a77d55c9802cc7d919f7dd794bd5fea30eSailesh Nepal     *
1061e7ef59a77d55c9802cc7d919f7dd794bd5fea30eSailesh Nepal     * @param statusHints The status label and icon to set.
1062e7ef59a77d55c9802cc7d919f7dd794bd5fea30eSailesh Nepal     */
1063e7ef59a77d55c9802cc7d919f7dd794bd5fea30eSailesh Nepal    public final void setStatusHints(StatusHints statusHints) {
10645c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        checkImmutable();
1065d34e5713c9571859d12e9c2e83ce3946cacdd68eSantos Cordon        mStatusHints = statusHints;
1066d34e5713c9571859d12e9c2e83ce3946cacdd68eSantos Cordon        for (Listener l : mListeners) {
1067d34e5713c9571859d12e9c2e83ce3946cacdd68eSantos Cordon            l.onStatusHintsChanged(this, statusHints);
1068d34e5713c9571859d12e9c2e83ce3946cacdd68eSantos Cordon        }
1069e7ef59a77d55c9802cc7d919f7dd794bd5fea30eSailesh Nepal    }
1070e7ef59a77d55c9802cc7d919f7dd794bd5fea30eSailesh Nepal
1071e7ef59a77d55c9802cc7d919f7dd794bd5fea30eSailesh Nepal    /**
10727c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon     * Sets the connections with which this connection can be conferenced.
10737c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon     *
10747c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon     * @param conferenceableConnections The set of connections this connection can conference with.
10757c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon     */
10767c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon    public final void setConferenceableConnections(List<Connection> conferenceableConnections) {
10775c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        checkImmutable();
10787c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon        clearConferenceableList();
10797c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon        for (Connection c : conferenceableConnections) {
10807c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon            // If statement checks for duplicates in input. It makes it N^2 but we're dealing with a
10817c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon            // small amount of items here.
10826d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn            if (!mConferenceables.contains(c)) {
10837c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon                c.addConnectionListener(mConnectionDeathListener);
10846d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn                mConferenceables.add(c);
10857c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon            }
10867c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon        }
10877c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon        fireOnConferenceableConnectionsChanged();
10887c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon    }
10897c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon
10907c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon    /**
10916d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn     * Similar to {@link #setConferenceableConnections(java.util.List)}, sets a list of connections
10926d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn     * or conferences with which this connection can be conferenced.
10936d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn     *
10946d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn     * @param conferenceables The conferenceables.
1095b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad     */
10966d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn    public final void setConferenceables(List<IConferenceable> conferenceables) {
10976d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn        clearConferenceableList();
10986d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn        for (IConferenceable c : conferenceables) {
10996d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn            // If statement checks for duplicates in input. It makes it N^2 but we're dealing with a
11006d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn            // small amount of items here.
11016d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn            if (!mConferenceables.contains(c)) {
11026d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn                if (c instanceof Connection) {
11036d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn                    Connection connection = (Connection) c;
11046d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn                    connection.addConnectionListener(mConnectionDeathListener);
11056d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn                } else if (c instanceof Conference) {
11066d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn                    Conference conference = (Conference) c;
11076d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn                    conference.addListener(mConferenceDeathListener);
11086d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn                }
11096d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn                mConferenceables.add(c);
11106d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn            }
11116d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn        }
11126d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn        fireOnConferenceableConnectionsChanged();
11136d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn    }
11146d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn
11156d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn    /**
11166d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn     * Returns the connections or conferences with which this connection can be conferenced.
11176d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn     */
11186d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn    public final List<IConferenceable> getConferenceables() {
11196d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn        return mUnmodifiableConferenceables;
1120b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad    }
1121b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
11228635c578f0408ca76cbaef5464d27bfde7450425Evan Charlton    /*
1123823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon     * @hide
1124823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon     */
1125823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon    public final void setConnectionService(ConnectionService connectionService) {
11265c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        checkImmutable();
1127823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon        if (mConnectionService != null) {
1128823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon            Log.e(this, new Exception(), "Trying to set ConnectionService on a connection " +
1129823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon                    "which is already associated with another ConnectionService.");
1130823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon        } else {
1131823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon            mConnectionService = connectionService;
1132823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon        }
1133823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon    }
1134823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon
1135823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon    /**
1136823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon     * @hide
1137823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon     */
1138823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon    public final void unsetConnectionService(ConnectionService connectionService) {
1139823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon        if (mConnectionService != connectionService) {
1140823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon            Log.e(this, new Exception(), "Trying to remove ConnectionService from a Connection " +
1141823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon                    "that does not belong to the ConnectionService.");
1142823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon        } else {
1143823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon            mConnectionService = null;
1144823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon        }
1145823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon    }
1146823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon
1147823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon    /**
1148af1b296a41f0b6e3af34e9c2c73bc1029bfa8b2aSantos Cordon     * @hide
1149af1b296a41f0b6e3af34e9c2c73bc1029bfa8b2aSantos Cordon     */
1150af1b296a41f0b6e3af34e9c2c73bc1029bfa8b2aSantos Cordon    public final ConnectionService getConnectionService() {
1151af1b296a41f0b6e3af34e9c2c73bc1029bfa8b2aSantos Cordon        return mConnectionService;
1152af1b296a41f0b6e3af34e9c2c73bc1029bfa8b2aSantos Cordon    }
1153af1b296a41f0b6e3af34e9c2c73bc1029bfa8b2aSantos Cordon
1154af1b296a41f0b6e3af34e9c2c73bc1029bfa8b2aSantos Cordon    /**
1155823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon     * Sets the conference that this connection is a part of. This will fail if the connection is
11565c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * already part of a conference. {@link #resetConference} to un-set the conference first.
1157823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon     *
1158823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon     * @param conference The conference.
1159823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon     * @return {@code true} if the conference was successfully set.
1160823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon     * @hide
1161823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon     */
1162823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon    public final boolean setConference(Conference conference) {
11635c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        checkImmutable();
1164823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon        // We check to see if it is already part of another conference.
11650159ac0cfe20e8f85ee4150e64d91392850f8a3fSantos Cordon        if (mConference == null) {
1166823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon            mConference = conference;
11670159ac0cfe20e8f85ee4150e64d91392850f8a3fSantos Cordon            if (mConnectionService != null && mConnectionService.containsConference(conference)) {
11680159ac0cfe20e8f85ee4150e64d91392850f8a3fSantos Cordon                fireConferenceChanged();
11690159ac0cfe20e8f85ee4150e64d91392850f8a3fSantos Cordon            }
1170823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon            return true;
1171823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon        }
1172823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon        return false;
1173823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon    }
1174823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon
1175823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon    /**
1176823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon     * Resets the conference that this connection is a part of.
1177823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon     * @hide
1178823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon     */
1179823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon    public final void resetConference() {
1180823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon        if (mConference != null) {
11810159ac0cfe20e8f85ee4150e64d91392850f8a3fSantos Cordon            Log.d(this, "Conference reset");
1182823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon            mConference = null;
1183823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon            fireConferenceChanged();
1184823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon        }
1185823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon    }
1186823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon
1187b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad    /**
1188b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad     * Notifies this Connection that the {@link #getAudioState()} property has a new value.
1189400cc48512dc69e940ad4d233a3b47ee9574601dSailesh Nepal     *
11905c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * @param state The new connection audio state.
1191400cc48512dc69e940ad4d233a3b47ee9574601dSailesh Nepal     */
1192354b2bd0fe8647bd5c7e28f3598b9b7414846124Nancy Chen    public void onAudioStateChanged(AudioState state) {}
1193400cc48512dc69e940ad4d233a3b47ee9574601dSailesh Nepal
1194400cc48512dc69e940ad4d233a3b47ee9574601dSailesh Nepal    /**
1195bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton     * Notifies this Connection of an internal state change. This method is called after the
1196bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton     * state is changed.
1197f835897f9f799490de27653ae39141ba6bc14223Ihab Awad     *
1198b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad     * @param state The new state, one of the {@code STATE_*} constants.
1199f835897f9f799490de27653ae39141ba6bc14223Ihab Awad     */
1200354b2bd0fe8647bd5c7e28f3598b9b7414846124Nancy Chen    public void onStateChanged(int state) {}
1201f835897f9f799490de27653ae39141ba6bc14223Ihab Awad
1202f835897f9f799490de27653ae39141ba6bc14223Ihab Awad    /**
1203542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     * Notifies this Connection of a request to play a DTMF tone.
1204542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     *
1205542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     * @param c A DTMF character.
1206542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     */
1207f29511043e1c3bf750e28427410192c793363bf7Santos Cordon    public void onPlayDtmfTone(char c) {}
1208542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad
1209542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad    /**
1210542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     * Notifies this Connection of a request to stop any currently playing DTMF tones.
1211542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     */
1212f29511043e1c3bf750e28427410192c793363bf7Santos Cordon    public void onStopDtmfTone() {}
1213542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad
1214542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad    /**
1215542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     * Notifies this Connection of a request to disconnect.
1216542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     */
1217f29511043e1c3bf750e28427410192c793363bf7Santos Cordon    public void onDisconnect() {}
1218542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad
1219542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad    /**
12203b4b1dcb607b8932374a4bc8c9ab349b9bb68660Tyler Gunn     * Notifies this Connection of a request to disconnect a participant of the conference managed
12213b4b1dcb607b8932374a4bc8c9ab349b9bb68660Tyler Gunn     * by the connection.
12223b4b1dcb607b8932374a4bc8c9ab349b9bb68660Tyler Gunn     *
12233b4b1dcb607b8932374a4bc8c9ab349b9bb68660Tyler Gunn     * @param endpoint the {@link Uri} of the participant to disconnect.
12243b4b1dcb607b8932374a4bc8c9ab349b9bb68660Tyler Gunn     * @hide
12253b4b1dcb607b8932374a4bc8c9ab349b9bb68660Tyler Gunn     */
12263b4b1dcb607b8932374a4bc8c9ab349b9bb68660Tyler Gunn    public void onDisconnectConferenceParticipant(Uri endpoint) {}
12273b4b1dcb607b8932374a4bc8c9ab349b9bb68660Tyler Gunn
12283b4b1dcb607b8932374a4bc8c9ab349b9bb68660Tyler Gunn    /**
12297c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon     * Notifies this Connection of a request to separate from its parent conference.
1230b693998fdfdd4498a33c4c69405f2708e4840aa7Santos Cordon     */
1231f29511043e1c3bf750e28427410192c793363bf7Santos Cordon    public void onSeparate() {}
1232b693998fdfdd4498a33c4c69405f2708e4840aa7Santos Cordon
1233b693998fdfdd4498a33c4c69405f2708e4840aa7Santos Cordon    /**
1234542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     * Notifies this Connection of a request to abort.
1235542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     */
1236f29511043e1c3bf750e28427410192c793363bf7Santos Cordon    public void onAbort() {}
1237542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad
1238542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad    /**
1239542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     * Notifies this Connection of a request to hold.
1240542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     */
1241f29511043e1c3bf750e28427410192c793363bf7Santos Cordon    public void onHold() {}
1242542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad
1243542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad    /**
1244542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     * Notifies this Connection of a request to exit a hold state.
1245542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     */
1246f29511043e1c3bf750e28427410192c793363bf7Santos Cordon    public void onUnhold() {}
1247542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad
1248542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad    /**
1249b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad     * Notifies this Connection, which is in {@link #STATE_RINGING}, of
1250d34e5713c9571859d12e9c2e83ce3946cacdd68eSantos Cordon     * a request to accept.
12518da4c3c11faf066b2b04ba853f03be6f1c4af5d8Andrew Lee     *
12525c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * @param videoState The video state in which to answer the connection.
1253be74de0978a7eaa577f6b61902b550a3161aff8bTyler Gunn     * @hide
1254542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     */
1255f29511043e1c3bf750e28427410192c793363bf7Santos Cordon    public void onAnswer(int videoState) {}
1256542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad
1257542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad    /**
1258b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad     * Notifies this Connection, which is in {@link #STATE_RINGING}, of
1259be74de0978a7eaa577f6b61902b550a3161aff8bTyler Gunn     * a request to accept.
1260be74de0978a7eaa577f6b61902b550a3161aff8bTyler Gunn     */
1261be74de0978a7eaa577f6b61902b550a3161aff8bTyler Gunn    public void onAnswer() {
1262be74de0978a7eaa577f6b61902b550a3161aff8bTyler Gunn        onAnswer(VideoProfile.VideoState.AUDIO_ONLY);
1263be74de0978a7eaa577f6b61902b550a3161aff8bTyler Gunn    }
1264be74de0978a7eaa577f6b61902b550a3161aff8bTyler Gunn
1265be74de0978a7eaa577f6b61902b550a3161aff8bTyler Gunn    /**
1266be74de0978a7eaa577f6b61902b550a3161aff8bTyler Gunn     * Notifies this Connection, which is in {@link #STATE_RINGING}, of
1267d34e5713c9571859d12e9c2e83ce3946cacdd68eSantos Cordon     * a request to reject.
1268542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad     */
1269f29511043e1c3bf750e28427410192c793363bf7Santos Cordon    public void onReject() {}
1270542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad
12716dea4aceba8f69ee4be346ec356d277a3c153f3dEvan Charlton    /**
12726dea4aceba8f69ee4be346ec356d277a3c153f3dEvan Charlton     * Notifies this Connection whether the user wishes to proceed with the post-dial DTMF codes.
12736dea4aceba8f69ee4be346ec356d277a3c153f3dEvan Charlton     */
1274f29511043e1c3bf750e28427410192c793363bf7Santos Cordon    public void onPostDialContinue(boolean proceed) {}
12756dea4aceba8f69ee4be346ec356d277a3c153f3dEvan Charlton
1276b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad    static String toLogSafePhoneNumber(String number) {
1277b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        // For unknown number, log empty string.
1278b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        if (number == null) {
1279b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            return "";
1280b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        }
1281b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
1282b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        if (PII_DEBUG) {
1283b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            // When PII_DEBUG is true we emit PII.
1284b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            return number;
1285b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        }
1286b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
1287b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        // Do exactly same thing as Uri#toSafeString() does, which will enable us to compare
1288b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        // sanitized phone numbers.
1289b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        StringBuilder builder = new StringBuilder();
1290b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        for (int i = 0; i < number.length(); i++) {
1291b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            char c = number.charAt(i);
1292b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            if (c == '-' || c == '@' || c == '.') {
1293b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                builder.append(c);
1294b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            } else {
1295b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                builder.append('x');
1296b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            }
1297b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        }
1298b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        return builder.toString();
1299b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad    }
1300b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
1301542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad    private void setState(int state) {
13025c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        checkImmutable();
13036107bab041fb7d851fbf865b7310d294aae970c8Ihab Awad        if (mState == STATE_DISCONNECTED && mState != state) {
13046107bab041fb7d851fbf865b7310d294aae970c8Ihab Awad            Log.d(this, "Connection already DISCONNECTED; cannot transition out of this state.");
1305bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton            return;
1306400cc48512dc69e940ad4d233a3b47ee9574601dSailesh Nepal        }
1307bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton        if (mState != state) {
1308bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton            Log.d(this, "setState: %s", stateToString(state));
1309bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton            mState = state;
1310354b2bd0fe8647bd5c7e28f3598b9b7414846124Nancy Chen            onStateChanged(state);
1311bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton            for (Listener l : mListeners) {
1312bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton                l.onStateChanged(this, state);
1313bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton            }
1314bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton        }
1315bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton    }
1316bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton
1317cf7020b7e84c1f5190db7167d70cb0675cd3332fSailesh Nepal    private static class FailureSignalingConnection extends Connection {
131890e34e324cbe22f18680809cbc33caf63b320cb4Ihab Awad        private boolean mImmutable = false;
13197f3d41fd124dd7c4a8b72c1d48df08a8ee7209ecAndrew Lee        public FailureSignalingConnection(DisconnectCause disconnectCause) {
13207f3d41fd124dd7c4a8b72c1d48df08a8ee7209ecAndrew Lee            setDisconnected(disconnectCause);
132190e34e324cbe22f18680809cbc33caf63b320cb4Ihab Awad            mImmutable = true;
13226107bab041fb7d851fbf865b7310d294aae970c8Ihab Awad        }
13235c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad
13245c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        public void checkImmutable() {
132590e34e324cbe22f18680809cbc33caf63b320cb4Ihab Awad            if (mImmutable) {
132690e34e324cbe22f18680809cbc33caf63b320cb4Ihab Awad                throw new UnsupportedOperationException("Connection is immutable");
132790e34e324cbe22f18680809cbc33caf63b320cb4Ihab Awad            }
13285c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        }
13296107bab041fb7d851fbf865b7310d294aae970c8Ihab Awad    }
13306107bab041fb7d851fbf865b7310d294aae970c8Ihab Awad
1331bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton    /**
13326107bab041fb7d851fbf865b7310d294aae970c8Ihab Awad     * Return a {@code Connection} which represents a failed connection attempt. The returned
13337f3d41fd124dd7c4a8b72c1d48df08a8ee7209ecAndrew Lee     * {@code Connection} will have a {@link android.telecom.DisconnectCause} and as specified,
13347f3d41fd124dd7c4a8b72c1d48df08a8ee7209ecAndrew Lee     * and a {@link #getState()} of {@link #STATE_DISCONNECTED}.
13356107bab041fb7d851fbf865b7310d294aae970c8Ihab Awad     * <p>
13366107bab041fb7d851fbf865b7310d294aae970c8Ihab Awad     * The returned {@code Connection} can be assumed to {@link #destroy()} itself when appropriate,
13376107bab041fb7d851fbf865b7310d294aae970c8Ihab Awad     * so users of this method need not maintain a reference to its return value to destroy it.
1338bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton     *
13397f3d41fd124dd7c4a8b72c1d48df08a8ee7209ecAndrew Lee     * @param disconnectCause The disconnect cause, ({@see android.telecomm.DisconnectCause}).
13406107bab041fb7d851fbf865b7310d294aae970c8Ihab Awad     * @return A {@code Connection} which indicates failure.
1341bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton     */
13427f3d41fd124dd7c4a8b72c1d48df08a8ee7209ecAndrew Lee    public static Connection createFailedConnection(DisconnectCause disconnectCause) {
13437f3d41fd124dd7c4a8b72c1d48df08a8ee7209ecAndrew Lee        return new FailureSignalingConnection(disconnectCause);
1344bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton    }
1345bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton
1346bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton    /**
13475c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * Override to throw an {@link UnsupportedOperationException} if this {@code Connection} is
13485c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * not intended to be mutated, e.g., if it is a marker for failure. Only for framework use;
13495c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * this should never be un-@hide-den.
13505c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     *
13515c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * @hide
13525c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     */
13535c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad    public void checkImmutable() {}
13545c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad
13555c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad    /**
13566107bab041fb7d851fbf865b7310d294aae970c8Ihab Awad     * Return a {@code Connection} which represents a canceled connection attempt. The returned
13576107bab041fb7d851fbf865b7310d294aae970c8Ihab Awad     * {@code Connection} will have state {@link #STATE_DISCONNECTED}, and cannot be moved out of
13586107bab041fb7d851fbf865b7310d294aae970c8Ihab Awad     * that state. This connection should not be used for anything, and no other
13596107bab041fb7d851fbf865b7310d294aae970c8Ihab Awad     * {@code Connection}s should be attempted.
13606107bab041fb7d851fbf865b7310d294aae970c8Ihab Awad     * <p>
13616107bab041fb7d851fbf865b7310d294aae970c8Ihab Awad     * so users of this method need not maintain a reference to its return value to destroy it.
1362bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton     *
13635c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * @return A {@code Connection} which indicates that the underlying connection should
13645c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * be canceled.
1365bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton     */
1366b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad    public static Connection createCanceledConnection() {
13677f3d41fd124dd7c4a8b72c1d48df08a8ee7209ecAndrew Lee        return new FailureSignalingConnection(new DisconnectCause(DisconnectCause.CANCELED));
1368542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad    }
13697c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon
13705c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad    private final void fireOnConferenceableConnectionsChanged() {
13717c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon        for (Listener l : mListeners) {
13726d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn            l.onConferenceablesChanged(this, getConferenceables());
13737c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon        }
13747c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon    }
13757c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon
1376823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon    private final void fireConferenceChanged() {
1377823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon        for (Listener l : mListeners) {
1378823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon            l.onConferenceChanged(this, mConference);
1379823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon        }
1380823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon    }
1381823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon
13827c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon    private final void clearConferenceableList() {
13836d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn        for (IConferenceable c : mConferenceables) {
13846d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn            if (c instanceof Connection) {
13856d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn                Connection connection = (Connection) c;
13866d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn                connection.removeConnectionListener(mConnectionDeathListener);
13876d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn            } else if (c instanceof Conference) {
13886d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn                Conference conference = (Conference) c;
13896d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn                conference.removeListener(mConferenceDeathListener);
13906d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn            }
13917c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon        }
13926d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn        mConferenceables.clear();
13937c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon    }
13943bffcf78b5e4bd8b60543126fc0bdb09808f28f5Tyler Gunn
13953bffcf78b5e4bd8b60543126fc0bdb09808f28f5Tyler Gunn    /**
1396ab4650c4563cd46e65ac37f924fee8febfd759c6Tyler Gunn     * Notifies listeners of a change to conference participant(s).
13973bffcf78b5e4bd8b60543126fc0bdb09808f28f5Tyler Gunn     *
1398ab4650c4563cd46e65ac37f924fee8febfd759c6Tyler Gunn     * @param conferenceParticipants The participants.
13993bffcf78b5e4bd8b60543126fc0bdb09808f28f5Tyler Gunn     * @hide
14003bffcf78b5e4bd8b60543126fc0bdb09808f28f5Tyler Gunn     */
1401ab4650c4563cd46e65ac37f924fee8febfd759c6Tyler Gunn    protected final void updateConferenceParticipants(
1402ab4650c4563cd46e65ac37f924fee8febfd759c6Tyler Gunn            List<ConferenceParticipant> conferenceParticipants) {
14033bffcf78b5e4bd8b60543126fc0bdb09808f28f5Tyler Gunn        for (Listener l : mListeners) {
1404ab4650c4563cd46e65ac37f924fee8febfd759c6Tyler Gunn            l.onConferenceParticipantsChanged(this, conferenceParticipants);
14053bffcf78b5e4bd8b60543126fc0bdb09808f28f5Tyler Gunn        }
14063bffcf78b5e4bd8b60543126fc0bdb09808f28f5Tyler Gunn    }
1407542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad}
1408