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