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