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