Connection.java revision 17455a3d39350a39eb995897929977d793358365
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 22542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awadimport android.net.Uri; 23b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awadimport android.os.Handler; 24b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awadimport android.os.IBinder; 25b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awadimport android.os.Message; 26b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awadimport android.os.RemoteException; 27b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awadimport android.view.Surface; 28542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad 29b693998fdfdd4498a33c4c69405f2708e4840aa7Santos Cordonimport java.util.ArrayList; 30b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awadimport java.util.Collections; 3175958420f2d294ceda517c2782b294002dc2969fTyler Gunnimport java.util.HashMap; 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. 47542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad */ 486d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunnpublic abstract class Connection implements IConferenceable { 49542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad 50b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad public static final int STATE_INITIALIZING = 0; 51b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad 52b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad public static final int STATE_NEW = 1; 53b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad 54b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad public static final int STATE_RINGING = 2; 55b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad 56b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad public static final int STATE_DIALING = 3; 57b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad 58b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad public static final int STATE_ACTIVE = 4; 59b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad 60b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad public static final int STATE_HOLDING = 5; 61b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad 62b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad public static final int STATE_DISCONNECTED = 6; 63b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad 645c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad /** Connection can currently be put on hold or unheld. */ 655c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad public static final int CAPABILITY_HOLD = 0x00000001; 665c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad 675c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad /** Connection supports the hold feature. */ 685c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad public static final int CAPABILITY_SUPPORT_HOLD = 0x00000002; 695c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad 705c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad /** 715c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad * Connections within a conference can be merged. A {@link ConnectionService} has the option to 725c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad * add a {@link Conference} before the child {@link Connection}s are merged. This is how 735c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad * CDMA-based {@link Connection}s are implemented. For these unmerged {@link Conference}s, this 745c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad * capability allows a merge button to be shown while the conference is in the foreground 755c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad * of the in-call UI. 765c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad * <p> 775c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad * This is only intended for use by a {@link Conference}. 785c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad */ 795c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad public static final int CAPABILITY_MERGE_CONFERENCE = 0x00000004; 805c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad 815c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad /** 825c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad * Connections within a conference can be swapped between foreground and background. 835c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad * See {@link #CAPABILITY_MERGE_CONFERENCE} for additional information. 845c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad * <p> 855c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad * This is only intended for use by a {@link Conference}. 865c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad */ 875c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad public static final int CAPABILITY_SWAP_CONFERENCE = 0x00000008; 885c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad 895c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad /** 905c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad * @hide 915c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad */ 925c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad public static final int CAPABILITY_UNUSED = 0x00000010; 935c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad 945c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad /** Connection supports responding via text option. */ 955c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad public static final int CAPABILITY_RESPOND_VIA_TEXT = 0x00000020; 965c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad 975c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad /** Connection can be muted. */ 985c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad public static final int CAPABILITY_MUTE = 0x00000040; 995c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad 1005c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad /** 1015c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad * Connection supports conference management. This capability only applies to 1025c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad * {@link Conference}s which can have {@link Connection}s as children. 1035c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad */ 1045c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad public static final int CAPABILITY_MANAGE_CONFERENCE = 0x00000080; 1055c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad 1065c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad /** 1075e9e8bb30e4d26eba46684c03ca950b602dfb830Andrew Lee * Local device supports receiving video. 1085c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad * @hide 1095c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad */ 1105e9e8bb30e4d26eba46684c03ca950b602dfb830Andrew Lee public static final int CAPABILITY_SUPPORTS_VT_LOCAL_RX = 0x00000100; 1115c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad 1125c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad /** 1135e9e8bb30e4d26eba46684c03ca950b602dfb830Andrew Lee * Local device supports transmitting video. 1145c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad * @hide 1155c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad */ 1165e9e8bb30e4d26eba46684c03ca950b602dfb830Andrew Lee public static final int CAPABILITY_SUPPORTS_VT_LOCAL_TX = 0x00000200; 1175c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad 1185c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad /** 1195e9e8bb30e4d26eba46684c03ca950b602dfb830Andrew Lee * Local device supports bidirectional video calling. 1205c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad * @hide 1215c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad */ 122e268f4c28ece283c8c9707b21c0ef7f940b907a8Andrew Lee public static final int CAPABILITY_SUPPORTS_VT_LOCAL_BIDIRECTIONAL = 1235e9e8bb30e4d26eba46684c03ca950b602dfb830Andrew Lee CAPABILITY_SUPPORTS_VT_LOCAL_RX | CAPABILITY_SUPPORTS_VT_LOCAL_TX; 1245c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad 1255c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad /** 1265e9e8bb30e4d26eba46684c03ca950b602dfb830Andrew Lee * Remote device supports receiving video. 1275c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad * @hide 1285c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad */ 1295e9e8bb30e4d26eba46684c03ca950b602dfb830Andrew Lee public static final int CAPABILITY_SUPPORTS_VT_REMOTE_RX = 0x00000400; 1305e9e8bb30e4d26eba46684c03ca950b602dfb830Andrew Lee 1315e9e8bb30e4d26eba46684c03ca950b602dfb830Andrew Lee /** 1325e9e8bb30e4d26eba46684c03ca950b602dfb830Andrew Lee * Remote device supports transmitting video. 1335e9e8bb30e4d26eba46684c03ca950b602dfb830Andrew Lee * @hide 1345e9e8bb30e4d26eba46684c03ca950b602dfb830Andrew Lee */ 1355e9e8bb30e4d26eba46684c03ca950b602dfb830Andrew Lee public static final int CAPABILITY_SUPPORTS_VT_REMOTE_TX = 0x00000800; 1365e9e8bb30e4d26eba46684c03ca950b602dfb830Andrew Lee 1375e9e8bb30e4d26eba46684c03ca950b602dfb830Andrew Lee /** 1385e9e8bb30e4d26eba46684c03ca950b602dfb830Andrew Lee * Remote device supports bidirectional video calling. 1395e9e8bb30e4d26eba46684c03ca950b602dfb830Andrew Lee * @hide 1405e9e8bb30e4d26eba46684c03ca950b602dfb830Andrew Lee */ 141e268f4c28ece283c8c9707b21c0ef7f940b907a8Andrew Lee public static final int CAPABILITY_SUPPORTS_VT_REMOTE_BIDIRECTIONAL = 1425e9e8bb30e4d26eba46684c03ca950b602dfb830Andrew Lee CAPABILITY_SUPPORTS_VT_REMOTE_RX | CAPABILITY_SUPPORTS_VT_REMOTE_TX; 1435c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad 1445c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad /** 1455c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad * Connection is able to be separated from its parent {@code Conference}, if any. 1465c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad */ 1475c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad public static final int CAPABILITY_SEPARATE_FROM_CONFERENCE = 0x00001000; 1485c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad 1495c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad /** 1505c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad * Connection is able to be individually disconnected when in a {@code Conference}. 1515c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad */ 1525c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad public static final int CAPABILITY_DISCONNECT_FROM_CONFERENCE = 0x00002000; 1535c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad 1545c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad /** 1555c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad * Whether the call is a generic conference, where we do not know the precise state of 1565c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad * participants in the conference (eg. on CDMA). 1575c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad * 1585c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad * @hide 1595c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad */ 1605c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad public static final int CAPABILITY_GENERIC_CONFERENCE = 0x00004000; 1615c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad 1625e9e8bb30e4d26eba46684c03ca950b602dfb830Andrew Lee /** 1635e9e8bb30e4d26eba46684c03ca950b602dfb830Andrew Lee * Connection is using high definition audio. 1645e9e8bb30e4d26eba46684c03ca950b602dfb830Andrew Lee * @hide 1655e9e8bb30e4d26eba46684c03ca950b602dfb830Andrew Lee */ 1665e9e8bb30e4d26eba46684c03ca950b602dfb830Andrew Lee public static final int CAPABILITY_HIGH_DEF_AUDIO = 0x00008000; 1675e9e8bb30e4d26eba46684c03ca950b602dfb830Andrew Lee 1685e9e8bb30e4d26eba46684c03ca950b602dfb830Andrew Lee /** 1695e9e8bb30e4d26eba46684c03ca950b602dfb830Andrew Lee * Connection is using WIFI. 1705e9e8bb30e4d26eba46684c03ca950b602dfb830Andrew Lee * @hide 1715e9e8bb30e4d26eba46684c03ca950b602dfb830Andrew Lee */ 172d11a31561e88fbbb4f614caff8a05e7ff9ecd357Tyler Gunn public static final int CAPABILITY_WIFI = 0x00010000; 1735e9e8bb30e4d26eba46684c03ca950b602dfb830Andrew Lee 174068085b35d4c7ef368fde6f01b42f87766d4a2b4Tyler Gunn /** 175068085b35d4c7ef368fde6f01b42f87766d4a2b4Tyler Gunn * Indicates that the current device callback number should be shown. 176068085b35d4c7ef368fde6f01b42f87766d4a2b4Tyler Gunn * 177068085b35d4c7ef368fde6f01b42f87766d4a2b4Tyler Gunn * @hide 178068085b35d4c7ef368fde6f01b42f87766d4a2b4Tyler Gunn */ 179d11a31561e88fbbb4f614caff8a05e7ff9ecd357Tyler Gunn public static final int CAPABILITY_SHOW_CALLBACK_NUMBER = 0x00020000; 180068085b35d4c7ef368fde6f01b42f87766d4a2b4Tyler Gunn 181d11a31561e88fbbb4f614caff8a05e7ff9ecd357Tyler Gunn /** 18289f41eb39e910e220957ac861651ead17eff9085Dong Zhou * Speed up audio setup for MT call. 18389f41eb39e910e220957ac861651ead17eff9085Dong Zhou * @hide 18489f41eb39e910e220957ac861651ead17eff9085Dong Zhou */ 185d11a31561e88fbbb4f614caff8a05e7ff9ecd357Tyler Gunn public static final int CAPABILITY_SPEED_UP_MT_AUDIO = 0x00040000; 186068085b35d4c7ef368fde6f01b42f87766d4a2b4Tyler Gunn 18707366813cdf3768dcd69a1f744023747564d654aRekha Kumar /** 188b5e0cfb24efded1e200989b5b48d49ac144c7704Tyler Gunn * Call can be upgraded to a video call. 18907366813cdf3768dcd69a1f744023747564d654aRekha Kumar * @hide 19007366813cdf3768dcd69a1f744023747564d654aRekha Kumar */ 19107366813cdf3768dcd69a1f744023747564d654aRekha Kumar public static final int CAPABILITY_CAN_UPGRADE_TO_VIDEO = 0x00080000; 19207366813cdf3768dcd69a1f744023747564d654aRekha Kumar 193b5e0cfb24efded1e200989b5b48d49ac144c7704Tyler Gunn /** 194b5e0cfb24efded1e200989b5b48d49ac144c7704Tyler Gunn * For video calls, indicates whether the outgoing video for the call can be paused using 195b5e0cfb24efded1e200989b5b48d49ac144c7704Tyler Gunn * the {@link android.telecom.VideoProfile.VideoState#PAUSED} VideoState. 196b5e0cfb24efded1e200989b5b48d49ac144c7704Tyler Gunn * @hide 197b5e0cfb24efded1e200989b5b48d49ac144c7704Tyler Gunn */ 198b5e0cfb24efded1e200989b5b48d49ac144c7704Tyler Gunn public static final int CAPABILITY_CAN_PAUSE_VIDEO = 0x00100000; 199b5e0cfb24efded1e200989b5b48d49ac144c7704Tyler Gunn 200d11a31561e88fbbb4f614caff8a05e7ff9ecd357Tyler Gunn //********************************************************************************************** 201b5e0cfb24efded1e200989b5b48d49ac144c7704Tyler Gunn // Next CAPABILITY value: 0x00200000 202d11a31561e88fbbb4f614caff8a05e7ff9ecd357Tyler Gunn //********************************************************************************************** 203068085b35d4c7ef368fde6f01b42f87766d4a2b4Tyler Gunn 204b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad // Flag controlling whether PII is emitted into the logs 205b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad private static final boolean PII_DEBUG = Log.isLoggable(android.util.Log.DEBUG); 206b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad 2075c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad /** 2085c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad * Whether the given capabilities support the specified capability. 2095c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad * 2105c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad * @param capabilities A capability bit field. 2115c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad * @param capability The capability to check capabilities for. 2125c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad * @return Whether the specified capability is supported. 2135c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad * @hide 2145c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad */ 2155c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad public static boolean can(int capabilities, int capability) { 2165c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad return (capabilities & capability) != 0; 2175c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad } 2185c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad 2195c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad /** 2205c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad * Whether the capabilities of this {@code Connection} supports the specified capability. 2215c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad * 2225c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad * @param capability The capability to check capabilities for. 2235c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad * @return Whether the specified capability is supported. 2245c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad * @hide 2255c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad */ 2265c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad public boolean can(int capability) { 2275c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad return can(mConnectionCapabilities, capability); 2285c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad } 2295c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad 2305c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad /** 2315c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad * Removes the specified capability from the set of capabilities of this {@code Connection}. 2325c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad * 2335c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad * @param capability The capability to remove from the set. 2345c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad * @hide 2355c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad */ 2365c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad public void removeCapability(int capability) { 2375c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad mConnectionCapabilities &= ~capability; 2385c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad } 2395c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad 2405c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad /** 2415c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad * Adds the specified capability to the set of capabilities of this {@code Connection}. 2425c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad * 2435c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad * @param capability The capability to add to the set. 2445c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad * @hide 2455c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad */ 2465c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad public void addCapability(int capability) { 2475c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad mConnectionCapabilities |= capability; 2485c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad } 2495c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad 2505c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad 2515c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad public static String capabilitiesToString(int capabilities) { 2525c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad StringBuilder builder = new StringBuilder(); 2535c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad builder.append("[Capabilities:"); 2545c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad if (can(capabilities, CAPABILITY_HOLD)) { 2555c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad builder.append(" CAPABILITY_HOLD"); 2565c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad } 2575c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad if (can(capabilities, CAPABILITY_SUPPORT_HOLD)) { 2585c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad builder.append(" CAPABILITY_SUPPORT_HOLD"); 2595c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad } 2605c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad if (can(capabilities, CAPABILITY_MERGE_CONFERENCE)) { 2615c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad builder.append(" CAPABILITY_MERGE_CONFERENCE"); 2625c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad } 2635c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad if (can(capabilities, CAPABILITY_SWAP_CONFERENCE)) { 2645c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad builder.append(" CAPABILITY_SWAP_CONFERENCE"); 2655c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad } 2665c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad if (can(capabilities, CAPABILITY_RESPOND_VIA_TEXT)) { 2675c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad builder.append(" CAPABILITY_RESPOND_VIA_TEXT"); 2685c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad } 2695c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad if (can(capabilities, CAPABILITY_MUTE)) { 2705c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad builder.append(" CAPABILITY_MUTE"); 2715c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad } 2725c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad if (can(capabilities, CAPABILITY_MANAGE_CONFERENCE)) { 2735c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad builder.append(" CAPABILITY_MANAGE_CONFERENCE"); 2745c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad } 2755e9e8bb30e4d26eba46684c03ca950b602dfb830Andrew Lee if (can(capabilities, CAPABILITY_SUPPORTS_VT_LOCAL_RX)) { 2765e9e8bb30e4d26eba46684c03ca950b602dfb830Andrew Lee builder.append(" CAPABILITY_SUPPORTS_VT_LOCAL_RX"); 2775e9e8bb30e4d26eba46684c03ca950b602dfb830Andrew Lee } 2785e9e8bb30e4d26eba46684c03ca950b602dfb830Andrew Lee if (can(capabilities, CAPABILITY_SUPPORTS_VT_LOCAL_TX)) { 2795e9e8bb30e4d26eba46684c03ca950b602dfb830Andrew Lee builder.append(" CAPABILITY_SUPPORTS_VT_LOCAL_TX"); 2805e9e8bb30e4d26eba46684c03ca950b602dfb830Andrew Lee } 281e268f4c28ece283c8c9707b21c0ef7f940b907a8Andrew Lee if (can(capabilities, CAPABILITY_SUPPORTS_VT_LOCAL_BIDIRECTIONAL)) { 282e268f4c28ece283c8c9707b21c0ef7f940b907a8Andrew Lee builder.append(" CAPABILITY_SUPPORTS_VT_LOCAL_BIDIRECTIONAL"); 2835c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad } 2845e9e8bb30e4d26eba46684c03ca950b602dfb830Andrew Lee if (can(capabilities, CAPABILITY_SUPPORTS_VT_REMOTE_RX)) { 2855e9e8bb30e4d26eba46684c03ca950b602dfb830Andrew Lee builder.append(" CAPABILITY_SUPPORTS_VT_REMOTE_RX"); 2865e9e8bb30e4d26eba46684c03ca950b602dfb830Andrew Lee } 2875e9e8bb30e4d26eba46684c03ca950b602dfb830Andrew Lee if (can(capabilities, CAPABILITY_SUPPORTS_VT_REMOTE_TX)) { 2885e9e8bb30e4d26eba46684c03ca950b602dfb830Andrew Lee builder.append(" CAPABILITY_SUPPORTS_VT_REMOTE_TX"); 2895e9e8bb30e4d26eba46684c03ca950b602dfb830Andrew Lee } 290e268f4c28ece283c8c9707b21c0ef7f940b907a8Andrew Lee if (can(capabilities, CAPABILITY_SUPPORTS_VT_REMOTE_BIDIRECTIONAL)) { 291e268f4c28ece283c8c9707b21c0ef7f940b907a8Andrew Lee builder.append(" CAPABILITY_SUPPORTS_VT_REMOTE_BIDIRECTIONAL"); 2925c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad } 29380fff3c0a5f68d4b426a35468daeaf4ff4d3d375Andrew Lee if (can(capabilities, CAPABILITY_HIGH_DEF_AUDIO)) { 29480fff3c0a5f68d4b426a35468daeaf4ff4d3d375Andrew Lee builder.append(" CAPABILITY_HIGH_DEF_AUDIO"); 2955c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad } 2961a8ae3e7306b5094f36252e3315fddeaf8b952bcAndrew Lee if (can(capabilities, CAPABILITY_WIFI)) { 2971a8ae3e7306b5094f36252e3315fddeaf8b952bcAndrew Lee builder.append(" CAPABILITY_WIFI"); 2985c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad } 2995c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad if (can(capabilities, CAPABILITY_GENERIC_CONFERENCE)) { 3005c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad builder.append(" CAPABILITY_GENERIC_CONFERENCE"); 3015c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad } 302068085b35d4c7ef368fde6f01b42f87766d4a2b4Tyler Gunn if (can(capabilities, CAPABILITY_SHOW_CALLBACK_NUMBER)) { 303068085b35d4c7ef368fde6f01b42f87766d4a2b4Tyler Gunn builder.append(" CAPABILITY_SHOW_CALLBACK_NUMBER"); 304068085b35d4c7ef368fde6f01b42f87766d4a2b4Tyler Gunn } 30589f41eb39e910e220957ac861651ead17eff9085Dong Zhou if (can(capabilities, CAPABILITY_SPEED_UP_MT_AUDIO)) { 306d11a31561e88fbbb4f614caff8a05e7ff9ecd357Tyler Gunn builder.append(" CAPABILITY_SPEED_UP_MT_AUDIO"); 30789f41eb39e910e220957ac861651ead17eff9085Dong Zhou } 30807366813cdf3768dcd69a1f744023747564d654aRekha Kumar if (can(capabilities, CAPABILITY_CAN_UPGRADE_TO_VIDEO)) { 30907366813cdf3768dcd69a1f744023747564d654aRekha Kumar builder.append(" CAPABILITY_CAN_UPGRADE_TO_VIDEO"); 31007366813cdf3768dcd69a1f744023747564d654aRekha Kumar } 311b5e0cfb24efded1e200989b5b48d49ac144c7704Tyler Gunn if (can(capabilities, CAPABILITY_CAN_PAUSE_VIDEO)) { 312b5e0cfb24efded1e200989b5b48d49ac144c7704Tyler Gunn builder.append(" CAPABILITY_CAN_PAUSE_VIDEO"); 313b5e0cfb24efded1e200989b5b48d49ac144c7704Tyler Gunn } 3145c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad builder.append("]"); 3155c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad return builder.toString(); 3165c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad } 3175c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad 318091768c3021d740b7d66846d36405c4d4c76cc56Sailesh Nepal /** @hide */ 319612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepal public abstract static class Listener { 320542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad public void onStateChanged(Connection c, int state) {} 321100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee public void onAddressChanged(Connection c, Uri newAddress, int presentation) {} 322612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepal public void onCallerDisplayNameChanged( 323612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepal Connection c, String callerDisplayName, int presentation) {} 324aa07df84f279a87ad6370758c9d792a660f2cebbTyler Gunn public void onVideoStateChanged(Connection c, int videoState) {} 3257f3d41fd124dd7c4a8b72c1d48df08a8ee7209ecAndrew Lee public void onDisconnected(Connection c, DisconnectCause disconnectCause) {} 326091768c3021d740b7d66846d36405c4d4c76cc56Sailesh Nepal public void onPostDialWait(Connection c, String remaining) {} 32727d1c2d148fe377ca0d2744f0f85789a42c8f808Nancy Chen public void onPostDialChar(Connection c, char nextChar) {} 328100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee public void onRingbackRequested(Connection c, boolean ringback) {} 329612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepal public void onDestroyed(Connection c) {} 3305c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad public void onConnectionCapabilitiesChanged(Connection c, int capabilities) {} 331b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad public void onVideoProviderChanged( 332b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad Connection c, VideoProvider videoProvider) {} 333001bbbb239d4ef1005a87039c7c53e26d8f13ad6Sailesh Nepal public void onAudioModeIsVoipChanged(Connection c, boolean isVoip) {} 334001bbbb239d4ef1005a87039c7c53e26d8f13ad6Sailesh Nepal public void onStatusHintsChanged(Connection c, StatusHints statusHints) {} 3356d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn public void onConferenceablesChanged( 3366d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn Connection c, List<IConferenceable> conferenceables) {} 337823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon public void onConferenceChanged(Connection c, Conference conference) {} 3383bffcf78b5e4bd8b60543126fc0bdb09808f28f5Tyler Gunn /** @hide */ 339ab4650c4563cd46e65ac37f924fee8febfd759c6Tyler Gunn public void onConferenceParticipantsChanged(Connection c, 340ab4650c4563cd46e65ac37f924fee8febfd759c6Tyler Gunn List<ConferenceParticipant> participants) {} 3418a2b1199a6db0c6f2493e96e25ec1d89e3f62769Tyler Gunn public void onConferenceStarted() {} 34217455a3d39350a39eb995897929977d793358365Anthony Lee public void onConferenceMergeFailed(Connection c) {} 343542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad } 344542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad 345b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad public static abstract class VideoProvider { 346b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad 347b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad /** 348b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad * Video is not being received (no protocol pause was issued). 349b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad */ 350b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad public static final int SESSION_EVENT_RX_PAUSE = 1; 351b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad 352b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad /** 353b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad * Video reception has resumed after a SESSION_EVENT_RX_PAUSE. 354b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad */ 355b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad public static final int SESSION_EVENT_RX_RESUME = 2; 356b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad 357b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad /** 358b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad * Video transmission has begun. This occurs after a negotiated start of video transmission 359b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad * when the underlying protocol has actually begun transmitting video to the remote party. 360b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad */ 361b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad public static final int SESSION_EVENT_TX_START = 3; 362b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad 363b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad /** 364b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad * Video transmission has stopped. This occurs after a negotiated stop of video transmission 365b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad * when the underlying protocol has actually stopped transmitting video to the remote party. 366b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad */ 367b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad public static final int SESSION_EVENT_TX_STOP = 4; 368b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad 369b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad /** 370b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad * A camera failure has occurred for the selected camera. The In-Call UI can use this as a 371b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad * cue to inform the user the camera is not available. 372b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad */ 373b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad public static final int SESSION_EVENT_CAMERA_FAILURE = 5; 374b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad 375b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad /** 376b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad * Issued after {@code SESSION_EVENT_CAMERA_FAILURE} when the camera is once again ready for 377b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad * operation. The In-Call UI can use this as a cue to inform the user that the camera has 378b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad * become available again. 379b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad */ 380b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad public static final int SESSION_EVENT_CAMERA_READY = 6; 381b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad 382b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad /** 383b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad * Session modify request was successful. 384b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad */ 385b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad public static final int SESSION_MODIFY_REQUEST_SUCCESS = 1; 386b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad 387b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad /** 388b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad * Session modify request failed. 389b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad */ 390b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad public static final int SESSION_MODIFY_REQUEST_FAIL = 2; 391b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad 392b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad /** 393b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad * Session modify request ignored due to invalid parameters. 394b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad */ 395b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad public static final int SESSION_MODIFY_REQUEST_INVALID = 3; 396b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad 39707366813cdf3768dcd69a1f744023747564d654aRekha Kumar /** 39807366813cdf3768dcd69a1f744023747564d654aRekha Kumar * Session modify request timed out. 39907366813cdf3768dcd69a1f744023747564d654aRekha Kumar */ 40007366813cdf3768dcd69a1f744023747564d654aRekha Kumar public static final int SESSION_MODIFY_REQUEST_TIMED_OUT = 4; 40107366813cdf3768dcd69a1f744023747564d654aRekha Kumar 40207366813cdf3768dcd69a1f744023747564d654aRekha Kumar /** 40307366813cdf3768dcd69a1f744023747564d654aRekha Kumar * Session modify request rejected by remote UE. 40407366813cdf3768dcd69a1f744023747564d654aRekha Kumar */ 40507366813cdf3768dcd69a1f744023747564d654aRekha Kumar public static final int SESSION_MODIFY_REQUEST_REJECTED_BY_REMOTE = 5; 40607366813cdf3768dcd69a1f744023747564d654aRekha Kumar 40775958420f2d294ceda517c2782b294002dc2969fTyler Gunn private static final int MSG_ADD_VIDEO_CALLBACK = 1; 408b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad private static final int MSG_SET_CAMERA = 2; 409b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad private static final int MSG_SET_PREVIEW_SURFACE = 3; 410b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad private static final int MSG_SET_DISPLAY_SURFACE = 4; 411b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad private static final int MSG_SET_DEVICE_ORIENTATION = 5; 412b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad private static final int MSG_SET_ZOOM = 6; 413b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad private static final int MSG_SEND_SESSION_MODIFY_REQUEST = 7; 414b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad private static final int MSG_SEND_SESSION_MODIFY_RESPONSE = 8; 415b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad private static final int MSG_REQUEST_CAMERA_CAPABILITIES = 9; 4165c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad private static final int MSG_REQUEST_CONNECTION_DATA_USAGE = 10; 417b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad private static final int MSG_SET_PAUSE_IMAGE = 11; 41875958420f2d294ceda517c2782b294002dc2969fTyler Gunn private static final int MSG_REMOVE_VIDEO_CALLBACK = 12; 419b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad 420b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad private final VideoProvider.VideoProviderHandler 421b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad mMessageHandler = new VideoProvider.VideoProviderHandler(); 422b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad private final VideoProvider.VideoProviderBinder mBinder; 42375958420f2d294ceda517c2782b294002dc2969fTyler Gunn 42475958420f2d294ceda517c2782b294002dc2969fTyler Gunn /** 42575958420f2d294ceda517c2782b294002dc2969fTyler Gunn * Stores a list of the video callbacks, keyed by IBinder. 42675958420f2d294ceda517c2782b294002dc2969fTyler Gunn */ 42775958420f2d294ceda517c2782b294002dc2969fTyler Gunn private HashMap<IBinder, IVideoCallback> mVideoCallbacks = new HashMap<>(); 428b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad 429b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad /** 430b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad * Default handler used to consolidate binder method calls onto a single thread. 431b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad */ 432b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad private final class VideoProviderHandler extends Handler { 433b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad @Override 434b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad public void handleMessage(Message msg) { 435b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad switch (msg.what) { 43675958420f2d294ceda517c2782b294002dc2969fTyler Gunn case MSG_ADD_VIDEO_CALLBACK: { 43775958420f2d294ceda517c2782b294002dc2969fTyler Gunn IBinder binder = (IBinder) msg.obj; 43875958420f2d294ceda517c2782b294002dc2969fTyler Gunn IVideoCallback callback = IVideoCallback.Stub 43975958420f2d294ceda517c2782b294002dc2969fTyler Gunn .asInterface((IBinder) msg.obj); 44075958420f2d294ceda517c2782b294002dc2969fTyler Gunn if (mVideoCallbacks.containsKey(binder)) { 44175958420f2d294ceda517c2782b294002dc2969fTyler Gunn Log.i(this, "addVideoProvider - skipped; already present."); 44275958420f2d294ceda517c2782b294002dc2969fTyler Gunn break; 44375958420f2d294ceda517c2782b294002dc2969fTyler Gunn } 44475958420f2d294ceda517c2782b294002dc2969fTyler Gunn mVideoCallbacks.put(binder, callback); 44575958420f2d294ceda517c2782b294002dc2969fTyler Gunn Log.i(this, "addVideoProvider "+ mVideoCallbacks.size()); 44675958420f2d294ceda517c2782b294002dc2969fTyler Gunn break; 44775958420f2d294ceda517c2782b294002dc2969fTyler Gunn } 44875958420f2d294ceda517c2782b294002dc2969fTyler Gunn case MSG_REMOVE_VIDEO_CALLBACK: { 44975958420f2d294ceda517c2782b294002dc2969fTyler Gunn IBinder binder = (IBinder) msg.obj; 45075958420f2d294ceda517c2782b294002dc2969fTyler Gunn IVideoCallback callback = IVideoCallback.Stub 45175958420f2d294ceda517c2782b294002dc2969fTyler Gunn .asInterface((IBinder) msg.obj); 45275958420f2d294ceda517c2782b294002dc2969fTyler Gunn if (!mVideoCallbacks.containsKey(binder)) { 45375958420f2d294ceda517c2782b294002dc2969fTyler Gunn Log.i(this, "removeVideoProvider - skipped; not present."); 45475958420f2d294ceda517c2782b294002dc2969fTyler Gunn break; 45575958420f2d294ceda517c2782b294002dc2969fTyler Gunn } 45675958420f2d294ceda517c2782b294002dc2969fTyler Gunn mVideoCallbacks.remove(binder); 457b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad break; 45875958420f2d294ceda517c2782b294002dc2969fTyler Gunn } 459b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad case MSG_SET_CAMERA: 460b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad onSetCamera((String) msg.obj); 461b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad break; 462b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad case MSG_SET_PREVIEW_SURFACE: 463b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad onSetPreviewSurface((Surface) msg.obj); 464b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad break; 465b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad case MSG_SET_DISPLAY_SURFACE: 466b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad onSetDisplaySurface((Surface) msg.obj); 467b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad break; 468b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad case MSG_SET_DEVICE_ORIENTATION: 469b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad onSetDeviceOrientation(msg.arg1); 470b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad break; 471b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad case MSG_SET_ZOOM: 472b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad onSetZoom((Float) msg.obj); 473b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad break; 474b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad case MSG_SEND_SESSION_MODIFY_REQUEST: 475b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad onSendSessionModifyRequest((VideoProfile) msg.obj); 476b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad break; 477b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad case MSG_SEND_SESSION_MODIFY_RESPONSE: 478b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad onSendSessionModifyResponse((VideoProfile) msg.obj); 479b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad break; 480b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad case MSG_REQUEST_CAMERA_CAPABILITIES: 481b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad onRequestCameraCapabilities(); 482b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad break; 4835c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad case MSG_REQUEST_CONNECTION_DATA_USAGE: 4845c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad onRequestConnectionDataUsage(); 485b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad break; 486b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad case MSG_SET_PAUSE_IMAGE: 487b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad onSetPauseImage((String) msg.obj); 488b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad break; 489b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad default: 490b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad break; 491b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad } 492b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad } 493b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad } 494b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad 495b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad /** 496b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad * IVideoProvider stub implementation. 497b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad */ 498b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad private final class VideoProviderBinder extends IVideoProvider.Stub { 49975958420f2d294ceda517c2782b294002dc2969fTyler Gunn public void addVideoCallback(IBinder videoCallbackBinder) { 50075958420f2d294ceda517c2782b294002dc2969fTyler Gunn mMessageHandler.obtainMessage( 50175958420f2d294ceda517c2782b294002dc2969fTyler Gunn MSG_ADD_VIDEO_CALLBACK, videoCallbackBinder).sendToTarget(); 50275958420f2d294ceda517c2782b294002dc2969fTyler Gunn } 50375958420f2d294ceda517c2782b294002dc2969fTyler Gunn 50475958420f2d294ceda517c2782b294002dc2969fTyler Gunn public void removeVideoCallback(IBinder videoCallbackBinder) { 505b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad mMessageHandler.obtainMessage( 50675958420f2d294ceda517c2782b294002dc2969fTyler Gunn MSG_REMOVE_VIDEO_CALLBACK, videoCallbackBinder).sendToTarget(); 507b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad } 508b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad 509b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad public void setCamera(String cameraId) { 510b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad mMessageHandler.obtainMessage(MSG_SET_CAMERA, cameraId).sendToTarget(); 511b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad } 512b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad 513b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad public void setPreviewSurface(Surface surface) { 514b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad mMessageHandler.obtainMessage(MSG_SET_PREVIEW_SURFACE, surface).sendToTarget(); 515b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad } 516b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad 517b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad public void setDisplaySurface(Surface surface) { 518b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad mMessageHandler.obtainMessage(MSG_SET_DISPLAY_SURFACE, surface).sendToTarget(); 519b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad } 520b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad 521b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad public void setDeviceOrientation(int rotation) { 52207366813cdf3768dcd69a1f744023747564d654aRekha Kumar mMessageHandler.obtainMessage( 52307366813cdf3768dcd69a1f744023747564d654aRekha Kumar MSG_SET_DEVICE_ORIENTATION, rotation, 0).sendToTarget(); 524b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad } 525b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad 526b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad public void setZoom(float value) { 527b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad mMessageHandler.obtainMessage(MSG_SET_ZOOM, value).sendToTarget(); 528b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad } 529b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad 530b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad public void sendSessionModifyRequest(VideoProfile requestProfile) { 531b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad mMessageHandler.obtainMessage( 532b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad MSG_SEND_SESSION_MODIFY_REQUEST, requestProfile).sendToTarget(); 533b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad } 534b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad 535b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad public void sendSessionModifyResponse(VideoProfile responseProfile) { 536b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad mMessageHandler.obtainMessage( 537b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad MSG_SEND_SESSION_MODIFY_RESPONSE, responseProfile).sendToTarget(); 538b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad } 539b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad 540b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad public void requestCameraCapabilities() { 541b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad mMessageHandler.obtainMessage(MSG_REQUEST_CAMERA_CAPABILITIES).sendToTarget(); 542b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad } 543b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad 544b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad public void requestCallDataUsage() { 5455c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad mMessageHandler.obtainMessage(MSG_REQUEST_CONNECTION_DATA_USAGE).sendToTarget(); 546b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad } 547b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad 548b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad public void setPauseImage(String uri) { 549b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad mMessageHandler.obtainMessage(MSG_SET_PAUSE_IMAGE, uri).sendToTarget(); 550b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad } 551b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad } 552b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad 553b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad public VideoProvider() { 554b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad mBinder = new VideoProvider.VideoProviderBinder(); 555b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad } 556b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad 557b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad /** 558b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad * Returns binder object which can be used across IPC methods. 559b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad * @hide 560b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad */ 561b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad public final IVideoProvider getInterface() { 562b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad return mBinder; 563b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad } 564b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad 565b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad /** 5665c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad * Sets the camera to be used for video recording in a video connection. 567b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad * 568b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad * @param cameraId The id of the camera. 569b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad */ 570b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad public abstract void onSetCamera(String cameraId); 571b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad 572b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad /** 573b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad * Sets the surface to be used for displaying a preview of what the user's camera is 574b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad * currently capturing. When video transmission is enabled, this is the video signal which 575b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad * is sent to the remote device. 576b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad * 577b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad * @param surface The surface. 578b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad */ 579b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad public abstract void onSetPreviewSurface(Surface surface); 580b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad 581b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad /** 582b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad * Sets the surface to be used for displaying the video received from the remote device. 583b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad * 584b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad * @param surface The surface. 585b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad */ 586b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad public abstract void onSetDisplaySurface(Surface surface); 587b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad 588b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad /** 589b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad * Sets the device orientation, in degrees. Assumes that a standard portrait orientation of 590b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad * the device is 0 degrees. 591b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad * 592b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad * @param rotation The device orientation, in degrees. 593b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad */ 594b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad public abstract void onSetDeviceOrientation(int rotation); 595b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad 596b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad /** 597b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad * Sets camera zoom ratio. 598b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad * 599b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad * @param value The camera zoom ratio. 600b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad */ 601b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad public abstract void onSetZoom(float value); 602b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad 603b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad /** 604b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad * Issues a request to modify the properties of the current session. The request is 605b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad * sent to the remote device where it it handled by the In-Call UI. 6065c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad * Some examples of session modification requests: upgrade connection from audio to video, 6075c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad * downgrade connection from video to audio, pause video. 608b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad * 6095c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad * @param requestProfile The requested connection video properties. 610b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad */ 611b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad public abstract void onSendSessionModifyRequest(VideoProfile requestProfile); 612b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad 613b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad /**te 6145c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad * Provides a response to a request to change the current connection session video 615b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad * properties. 616b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad * This is in response to a request the InCall UI has received via the InCall UI. 617b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad * 6185c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad * @param responseProfile The response connection video properties. 619b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad */ 620b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad public abstract void onSendSessionModifyResponse(VideoProfile responseProfile); 621b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad 622b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad /** 623b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad * Issues a request to the video provider to retrieve the camera capabilities. 624b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad * Camera capabilities are reported back to the caller via the In-Call UI. 625b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad */ 626b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad public abstract void onRequestCameraCapabilities(); 627b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad 628b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad /** 629b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad * Issues a request to the video telephony framework to retrieve the cumulative data usage 6305c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad * for the current connection. Data usage is reported back to the caller via the 631b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad * InCall UI. 632b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad */ 6335c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad public abstract void onRequestConnectionDataUsage(); 634b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad 635b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad /** 636b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad * Provides the video telephony framework with the URI of an image to be displayed to remote 637b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad * devices when the video signal is paused. 638b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad * 639b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad * @param uri URI of image to display. 640b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad */ 641b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad public abstract void onSetPauseImage(String uri); 642b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad 643b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad /** 64475958420f2d294ceda517c2782b294002dc2969fTyler Gunn * Invokes callback method defined in listening {@link InCallService} implementations. 645b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad * 6465c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad * @param videoProfile The requested video connection profile. 647b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad */ 648b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad public void receiveSessionModifyRequest(VideoProfile videoProfile) { 64975958420f2d294ceda517c2782b294002dc2969fTyler Gunn if (mVideoCallbacks != null) { 650b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad try { 65175958420f2d294ceda517c2782b294002dc2969fTyler Gunn for (IVideoCallback callback : mVideoCallbacks.values()) { 65275958420f2d294ceda517c2782b294002dc2969fTyler Gunn callback.receiveSessionModifyRequest(videoProfile); 65375958420f2d294ceda517c2782b294002dc2969fTyler Gunn } 654b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad } catch (RemoteException ignored) { 655b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad } 656b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad } 657b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad } 658b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad 659b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad /** 66075958420f2d294ceda517c2782b294002dc2969fTyler Gunn * Invokes callback method defined in listening {@link InCallService} implementations. 661b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad * 662b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad * @param status Status of the session modify request. Valid values are 663b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad * {@link VideoProvider#SESSION_MODIFY_REQUEST_SUCCESS}, 664b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad * {@link VideoProvider#SESSION_MODIFY_REQUEST_FAIL}, 665b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad * {@link VideoProvider#SESSION_MODIFY_REQUEST_INVALID} 666b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad * @param requestedProfile The original request which was sent to the remote device. 667b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad * @param responseProfile The actual profile changes made by the remote device. 668b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad */ 669b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad public void receiveSessionModifyResponse(int status, 670b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad VideoProfile requestedProfile, VideoProfile responseProfile) { 67175958420f2d294ceda517c2782b294002dc2969fTyler Gunn if (mVideoCallbacks != null) { 672b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad try { 67375958420f2d294ceda517c2782b294002dc2969fTyler Gunn for (IVideoCallback callback : mVideoCallbacks.values()) { 67475958420f2d294ceda517c2782b294002dc2969fTyler Gunn callback.receiveSessionModifyResponse(status, requestedProfile, 67575958420f2d294ceda517c2782b294002dc2969fTyler Gunn responseProfile); 67675958420f2d294ceda517c2782b294002dc2969fTyler Gunn } 677b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad } catch (RemoteException ignored) { 678b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad } 679b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad } 680b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad } 681542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad 682b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad /** 68375958420f2d294ceda517c2782b294002dc2969fTyler Gunn * Invokes callback method defined in listening {@link InCallService} implementations. 684b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad * 685b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad * Valid values are: {@link VideoProvider#SESSION_EVENT_RX_PAUSE}, 686b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad * {@link VideoProvider#SESSION_EVENT_RX_RESUME}, 687b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad * {@link VideoProvider#SESSION_EVENT_TX_START}, 688b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad * {@link VideoProvider#SESSION_EVENT_TX_STOP} 689b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad * 690b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad * @param event The event. 691b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad */ 692b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad public void handleCallSessionEvent(int event) { 69375958420f2d294ceda517c2782b294002dc2969fTyler Gunn if (mVideoCallbacks != null) { 694b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad try { 69575958420f2d294ceda517c2782b294002dc2969fTyler Gunn for (IVideoCallback callback : mVideoCallbacks.values()) { 69675958420f2d294ceda517c2782b294002dc2969fTyler Gunn callback.handleCallSessionEvent(event); 69775958420f2d294ceda517c2782b294002dc2969fTyler Gunn } 698b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad } catch (RemoteException ignored) { 699b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad } 700b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad } 701b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad } 702b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad 703b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad /** 70475958420f2d294ceda517c2782b294002dc2969fTyler Gunn * Invokes callback method defined in listening {@link InCallService} implementations. 705b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad * 706b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad * @param width The updated peer video width. 707b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad * @param height The updated peer video height. 708b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad */ 709b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad public void changePeerDimensions(int width, int height) { 71075958420f2d294ceda517c2782b294002dc2969fTyler Gunn if (mVideoCallbacks != null) { 711b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad try { 71275958420f2d294ceda517c2782b294002dc2969fTyler Gunn for (IVideoCallback callback : mVideoCallbacks.values()) { 71375958420f2d294ceda517c2782b294002dc2969fTyler Gunn callback.changePeerDimensions(width, height); 71475958420f2d294ceda517c2782b294002dc2969fTyler Gunn } 715b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad } catch (RemoteException ignored) { 716b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad } 717b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad } 718b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad } 719bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton 720b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad /** 72175958420f2d294ceda517c2782b294002dc2969fTyler Gunn * Invokes callback method defined in listening {@link InCallService} implementations. 722b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad * 723b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad * @param dataUsage The updated data usage. 724b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad */ 72507366813cdf3768dcd69a1f744023747564d654aRekha Kumar public void changeCallDataUsage(long dataUsage) { 72675958420f2d294ceda517c2782b294002dc2969fTyler Gunn if (mVideoCallbacks != null) { 727b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad try { 72875958420f2d294ceda517c2782b294002dc2969fTyler Gunn for (IVideoCallback callback : mVideoCallbacks.values()) { 72975958420f2d294ceda517c2782b294002dc2969fTyler Gunn callback.changeCallDataUsage(dataUsage); 73075958420f2d294ceda517c2782b294002dc2969fTyler Gunn } 731b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad } catch (RemoteException ignored) { 732b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad } 733b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad } 734b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad } 735b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad 736b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad /** 73775958420f2d294ceda517c2782b294002dc2969fTyler Gunn * Invokes callback method defined in listening {@link InCallService} implementations. 738b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad * 739b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad * @param cameraCapabilities The changed camera capabilities. 740b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad */ 741b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad public void changeCameraCapabilities(CameraCapabilities cameraCapabilities) { 74275958420f2d294ceda517c2782b294002dc2969fTyler Gunn if (mVideoCallbacks != null) { 743b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad try { 74475958420f2d294ceda517c2782b294002dc2969fTyler Gunn for (IVideoCallback callback : mVideoCallbacks.values()) { 74575958420f2d294ceda517c2782b294002dc2969fTyler Gunn callback.changeCameraCapabilities(cameraCapabilities); 74675958420f2d294ceda517c2782b294002dc2969fTyler Gunn } 747b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad } catch (RemoteException ignored) { 748b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad } 749b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad } 750b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad } 75107366813cdf3768dcd69a1f744023747564d654aRekha Kumar 75207366813cdf3768dcd69a1f744023747564d654aRekha Kumar /** 75375958420f2d294ceda517c2782b294002dc2969fTyler Gunn * Invokes callback method defined in listening {@link InCallService} implementations. 75407366813cdf3768dcd69a1f744023747564d654aRekha Kumar * 75507366813cdf3768dcd69a1f744023747564d654aRekha Kumar * @param videoQuality The updated video quality. 75607366813cdf3768dcd69a1f744023747564d654aRekha Kumar */ 75707366813cdf3768dcd69a1f744023747564d654aRekha Kumar public void changeVideoQuality(int videoQuality) { 75875958420f2d294ceda517c2782b294002dc2969fTyler Gunn if (mVideoCallbacks != null) { 75907366813cdf3768dcd69a1f744023747564d654aRekha Kumar try { 76075958420f2d294ceda517c2782b294002dc2969fTyler Gunn for (IVideoCallback callback : mVideoCallbacks.values()) { 76175958420f2d294ceda517c2782b294002dc2969fTyler Gunn callback.changeVideoQuality(videoQuality); 76275958420f2d294ceda517c2782b294002dc2969fTyler Gunn } 76307366813cdf3768dcd69a1f744023747564d654aRekha Kumar } catch (RemoteException ignored) { 76407366813cdf3768dcd69a1f744023747564d654aRekha Kumar } 76507366813cdf3768dcd69a1f744023747564d654aRekha Kumar } 76607366813cdf3768dcd69a1f744023747564d654aRekha Kumar } 767542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad } 768542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad 7697c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon private final Listener mConnectionDeathListener = new Listener() { 7707c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon @Override 7717c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon public void onDestroyed(Connection c) { 7726d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn if (mConferenceables.remove(c)) { 7736d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn fireOnConferenceableConnectionsChanged(); 7746d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn } 7756d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn } 7766d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn }; 7776d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn 7786d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn private final Conference.Listener mConferenceDeathListener = new Conference.Listener() { 7796d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn @Override 7806d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn public void onDestroyed(Conference c) { 7816d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn if (mConferenceables.remove(c)) { 7827c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon fireOnConferenceableConnectionsChanged(); 7837c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon } 7847c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon } 7857c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon }; 7867c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon 787229e3820dce98f64fd4834d5f421faec9a9d7026Jay Shrauner /** 788229e3820dce98f64fd4834d5f421faec9a9d7026Jay Shrauner * ConcurrentHashMap constructor params: 8 is initial table size, 0.9f is 789229e3820dce98f64fd4834d5f421faec9a9d7026Jay Shrauner * load factor before resizing, 1 means we only expect a single thread to 790229e3820dce98f64fd4834d5f421faec9a9d7026Jay Shrauner * access the map so make only a single shard 791229e3820dce98f64fd4834d5f421faec9a9d7026Jay Shrauner */ 792229e3820dce98f64fd4834d5f421faec9a9d7026Jay Shrauner private final Set<Listener> mListeners = Collections.newSetFromMap( 793229e3820dce98f64fd4834d5f421faec9a9d7026Jay Shrauner new ConcurrentHashMap<Listener, Boolean>(8, 0.9f, 1)); 7946d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn private final List<IConferenceable> mConferenceables = new ArrayList<>(); 7956d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn private final List<IConferenceable> mUnmodifiableConferenceables = 7966d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn Collections.unmodifiableList(mConferenceables); 797b693998fdfdd4498a33c4c69405f2708e4840aa7Santos Cordon 798b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad private int mState = STATE_NEW; 799b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad private AudioState mAudioState; 800100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee private Uri mAddress; 801100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee private int mAddressPresentation; 802612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepal private String mCallerDisplayName; 803612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepal private int mCallerDisplayNamePresentation; 804100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee private boolean mRingbackRequested = false; 8055c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad private int mConnectionCapabilities; 806b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad private VideoProvider mVideoProvider; 80733aaae4a07fdcce223fe74d96d751f4bffa6723aSailesh Nepal private boolean mAudioModeIsVoip; 808e7ef59a77d55c9802cc7d919f7dd794bd5fea30eSailesh Nepal private StatusHints mStatusHints; 809aa07df84f279a87ad6370758c9d792a660f2cebbTyler Gunn private int mVideoState; 8107f3d41fd124dd7c4a8b72c1d48df08a8ee7209ecAndrew Lee private DisconnectCause mDisconnectCause; 811823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon private Conference mConference; 812823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon private ConnectionService mConnectionService; 813542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad 814542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad /** 815542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad * Create a new Connection. 816542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad */ 817f29511043e1c3bf750e28427410192c793363bf7Santos Cordon public Connection() {} 818542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad 819542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad /** 820100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee * @return The address (e.g., phone number) to which this Connection is currently communicating. 821542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad */ 822100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee public final Uri getAddress() { 823100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee return mAddress; 824542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad } 825542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad 826542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad /** 827100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee * @return The presentation requirements for the address. 828ef9f6f957d897ea0ed82114185b8fa3fefd4917bTyler Gunn * See {@link TelecomManager} for valid values. 829542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad */ 830100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee public final int getAddressPresentation() { 831100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee return mAddressPresentation; 832612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepal } 833612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepal 834612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepal /** 835612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepal * @return The caller display name (CNAP). 836612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepal */ 837612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepal public final String getCallerDisplayName() { 838612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepal return mCallerDisplayName; 839612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepal } 840612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepal 841612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepal /** 8429d568c01db1f90fbe9cbff1d9385e7e7b809e066Nancy Chen * @return The presentation requirements for the handle. 843ef9f6f957d897ea0ed82114185b8fa3fefd4917bTyler Gunn * See {@link TelecomManager} for valid values. 844612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepal */ 845612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepal public final int getCallerDisplayNamePresentation() { 846612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepal return mCallerDisplayNamePresentation; 847542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad } 848542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad 849542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad /** 850612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepal * @return The state of this Connection. 8518d83fa9bbd2ad15299a4419241eb10404e7839beTyler Gunn */ 852612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepal public final int getState() { 853612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepal return mState; 8542a46b90222e5c9c73de012382a604a71f9c0c30cSailesh Nepal } 8558d83fa9bbd2ad15299a4419241eb10404e7839beTyler Gunn 8568d83fa9bbd2ad15299a4419241eb10404e7839beTyler Gunn /** 8575c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad * Returns the video state of the connection. 858b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad * Valid values: {@link VideoProfile.VideoState#AUDIO_ONLY}, 859b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad * {@link VideoProfile.VideoState#BIDIRECTIONAL}, 860b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad * {@link VideoProfile.VideoState#TX_ENABLED}, 861b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad * {@link VideoProfile.VideoState#RX_ENABLED}. 862aa07df84f279a87ad6370758c9d792a660f2cebbTyler Gunn * 8635c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad * @return The video state of the connection. 86427d1e257f3cba2d5954e5562db69035df9ecf290Tyler Gunn * @hide 865aa07df84f279a87ad6370758c9d792a660f2cebbTyler Gunn */ 866aa07df84f279a87ad6370758c9d792a660f2cebbTyler Gunn public final int getVideoState() { 867aa07df84f279a87ad6370758c9d792a660f2cebbTyler Gunn return mVideoState; 868aa07df84f279a87ad6370758c9d792a660f2cebbTyler Gunn } 869aa07df84f279a87ad6370758c9d792a660f2cebbTyler Gunn 870aa07df84f279a87ad6370758c9d792a660f2cebbTyler Gunn /** 8715c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad * @return The audio state of the connection, describing how its audio is currently 872542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad * being routed by the system. This is {@code null} if this Connection 873542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad * does not directly know about its audio state. 874542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad */ 875b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad public final AudioState getAudioState() { 876b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad return mAudioState; 877542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad } 878542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad 879542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad /** 880823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon * @return The conference that this connection is a part of. Null if it is not part of any 881823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon * conference. 8822a46b90222e5c9c73de012382a604a71f9c0c30cSailesh Nepal */ 883823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon public final Conference getConference() { 884823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon return mConference; 8852a46b90222e5c9c73de012382a604a71f9c0c30cSailesh Nepal } 8862a46b90222e5c9c73de012382a604a71f9c0c30cSailesh Nepal 8872a46b90222e5c9c73de012382a604a71f9c0c30cSailesh Nepal /** 888823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon * Returns whether this connection is requesting that the system play a ringback tone 889823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon * on its behalf. 8902a46b90222e5c9c73de012382a604a71f9c0c30cSailesh Nepal */ 891100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee public final boolean isRingbackRequested() { 892100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee return mRingbackRequested; 8932a46b90222e5c9c73de012382a604a71f9c0c30cSailesh Nepal } 8942a46b90222e5c9c73de012382a604a71f9c0c30cSailesh Nepal 8952a46b90222e5c9c73de012382a604a71f9c0c30cSailesh Nepal /** 89633aaae4a07fdcce223fe74d96d751f4bffa6723aSailesh Nepal * @return True if the connection's audio mode is VOIP. 89733aaae4a07fdcce223fe74d96d751f4bffa6723aSailesh Nepal */ 89833aaae4a07fdcce223fe74d96d751f4bffa6723aSailesh Nepal public final boolean getAudioModeIsVoip() { 89933aaae4a07fdcce223fe74d96d751f4bffa6723aSailesh Nepal return mAudioModeIsVoip; 90033aaae4a07fdcce223fe74d96d751f4bffa6723aSailesh Nepal } 90133aaae4a07fdcce223fe74d96d751f4bffa6723aSailesh Nepal 90233aaae4a07fdcce223fe74d96d751f4bffa6723aSailesh Nepal /** 903e7ef59a77d55c9802cc7d919f7dd794bd5fea30eSailesh Nepal * @return The status hints for this connection. 904e7ef59a77d55c9802cc7d919f7dd794bd5fea30eSailesh Nepal */ 905e7ef59a77d55c9802cc7d919f7dd794bd5fea30eSailesh Nepal public final StatusHints getStatusHints() { 906e7ef59a77d55c9802cc7d919f7dd794bd5fea30eSailesh Nepal return mStatusHints; 907e7ef59a77d55c9802cc7d919f7dd794bd5fea30eSailesh Nepal } 908e7ef59a77d55c9802cc7d919f7dd794bd5fea30eSailesh Nepal 909e7ef59a77d55c9802cc7d919f7dd794bd5fea30eSailesh Nepal /** 910542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad * Assign a listener to be notified of state changes. 911542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad * 912542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad * @param l A listener. 913542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad * @return This Connection. 914542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad * 915542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad * @hide 916542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad */ 917542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad public final Connection addConnectionListener(Listener l) { 918d34e5713c9571859d12e9c2e83ce3946cacdd68eSantos Cordon mListeners.add(l); 919542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad return this; 920542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad } 921542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad 922542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad /** 923542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad * Remove a previously assigned listener that was being notified of state changes. 924542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad * 925542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad * @param l A Listener. 926542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad * @return This Connection. 927542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad * 928542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad * @hide 929542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad */ 930542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad public final Connection removeConnectionListener(Listener l) { 931229e3820dce98f64fd4834d5f421faec9a9d7026Jay Shrauner if (l != null) { 932229e3820dce98f64fd4834d5f421faec9a9d7026Jay Shrauner mListeners.remove(l); 933229e3820dce98f64fd4834d5f421faec9a9d7026Jay Shrauner } 934542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad return this; 935542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad } 936542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad 937542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad /** 938cf7020b7e84c1f5190db7167d70cb0675cd3332fSailesh Nepal * @return The {@link DisconnectCause} for this connection. 939bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton */ 9407f3d41fd124dd7c4a8b72c1d48df08a8ee7209ecAndrew Lee public final DisconnectCause getDisconnectCause() { 941cf7020b7e84c1f5190db7167d70cb0675cd3332fSailesh Nepal return mDisconnectCause; 942bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton } 943bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton 944bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton /** 945542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad * Inform this Connection that the state of its audio output has been changed externally. 946542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad * 947542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad * @param state The new audio state. 948400cc48512dc69e940ad4d233a3b47ee9574601dSailesh Nepal * @hide 949542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad */ 950b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad final void setAudioState(AudioState state) { 9515c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad checkImmutable(); 95260ac30bb8a30fa7283d592c12ddf2da9447adf14Ihab Awad Log.d(this, "setAudioState %s", state); 953b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad mAudioState = state; 954354b2bd0fe8647bd5c7e28f3598b9b7414846124Nancy Chen onAudioStateChanged(state); 955542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad } 956542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad 957542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad /** 958b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad * @param state An integer value of a {@code STATE_*} constant. 959542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad * @return A string representation of the value. 960542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad */ 961542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad public static String stateToString(int state) { 962542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad switch (state) { 963b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad case STATE_INITIALIZING: 964b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad return "STATE_INITIALIZING"; 965b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad case STATE_NEW: 966b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad return "STATE_NEW"; 967b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad case STATE_RINGING: 968b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad return "STATE_RINGING"; 969b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad case STATE_DIALING: 970b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad return "STATE_DIALING"; 971b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad case STATE_ACTIVE: 972b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad return "STATE_ACTIVE"; 973b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad case STATE_HOLDING: 974b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad return "STATE_HOLDING"; 975b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad case STATE_DISCONNECTED: 976542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad return "DISCONNECTED"; 977542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad default: 97860ac30bb8a30fa7283d592c12ddf2da9447adf14Ihab Awad Log.wtf(Connection.class, "Unknown state %d", state); 979542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad return "UNKNOWN"; 980542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad } 981542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad } 982542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad 983542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad /** 9845c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad * Returns the connection's capabilities, as a bit mask of the {@code CAPABILITY_*} constants. 98552a28f619fca8c2118e1f421cb56f6542805e954Ihab Awad */ 9865c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad public final int getConnectionCapabilities() { 9875c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad return mConnectionCapabilities; 98852a28f619fca8c2118e1f421cb56f6542805e954Ihab Awad } 98952a28f619fca8c2118e1f421cb56f6542805e954Ihab Awad 99052a28f619fca8c2118e1f421cb56f6542805e954Ihab Awad /** 991100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee * Sets the value of the {@link #getAddress()} property. 992542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad * 993100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee * @param address The new address. 994100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee * @param presentation The presentation requirements for the address. 995ef9f6f957d897ea0ed82114185b8fa3fefd4917bTyler Gunn * See {@link TelecomManager} for valid values. 996542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad */ 997100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee public final void setAddress(Uri address, int presentation) { 9985c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad checkImmutable(); 999100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee Log.d(this, "setAddress %s", address); 1000100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee mAddress = address; 1001100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee mAddressPresentation = presentation; 1002d34e5713c9571859d12e9c2e83ce3946cacdd68eSantos Cordon for (Listener l : mListeners) { 1003100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee l.onAddressChanged(this, address, presentation); 1004d34e5713c9571859d12e9c2e83ce3946cacdd68eSantos Cordon } 1005542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad } 1006542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad 1007542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad /** 1008612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepal * Sets the caller display name (CNAP). 10092a46b90222e5c9c73de012382a604a71f9c0c30cSailesh Nepal * 1010612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepal * @param callerDisplayName The new display name. 10119d568c01db1f90fbe9cbff1d9385e7e7b809e066Nancy Chen * @param presentation The presentation requirements for the handle. 1012ef9f6f957d897ea0ed82114185b8fa3fefd4917bTyler Gunn * See {@link TelecomManager} for valid values. 1013612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepal */ 1014612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepal public final void setCallerDisplayName(String callerDisplayName, int presentation) { 10155c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad checkImmutable(); 1016612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepal Log.d(this, "setCallerDisplayName %s", callerDisplayName); 1017d34e5713c9571859d12e9c2e83ce3946cacdd68eSantos Cordon mCallerDisplayName = callerDisplayName; 1018d34e5713c9571859d12e9c2e83ce3946cacdd68eSantos Cordon mCallerDisplayNamePresentation = presentation; 1019d34e5713c9571859d12e9c2e83ce3946cacdd68eSantos Cordon for (Listener l : mListeners) { 1020d34e5713c9571859d12e9c2e83ce3946cacdd68eSantos Cordon l.onCallerDisplayNameChanged(this, callerDisplayName, presentation); 1021d34e5713c9571859d12e9c2e83ce3946cacdd68eSantos Cordon } 10222a46b90222e5c9c73de012382a604a71f9c0c30cSailesh Nepal } 10232a46b90222e5c9c73de012382a604a71f9c0c30cSailesh Nepal 10242a46b90222e5c9c73de012382a604a71f9c0c30cSailesh Nepal /** 1025aa07df84f279a87ad6370758c9d792a660f2cebbTyler Gunn * Set the video state for the connection. 1026b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad * Valid values: {@link VideoProfile.VideoState#AUDIO_ONLY}, 1027b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad * {@link VideoProfile.VideoState#BIDIRECTIONAL}, 1028b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad * {@link VideoProfile.VideoState#TX_ENABLED}, 1029b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad * {@link VideoProfile.VideoState#RX_ENABLED}. 1030aa07df84f279a87ad6370758c9d792a660f2cebbTyler Gunn * 1031aa07df84f279a87ad6370758c9d792a660f2cebbTyler Gunn * @param videoState The new video state. 103227d1e257f3cba2d5954e5562db69035df9ecf290Tyler Gunn * @hide 1033aa07df84f279a87ad6370758c9d792a660f2cebbTyler Gunn */ 1034aa07df84f279a87ad6370758c9d792a660f2cebbTyler Gunn public final void setVideoState(int videoState) { 10355c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad checkImmutable(); 1036aa07df84f279a87ad6370758c9d792a660f2cebbTyler Gunn Log.d(this, "setVideoState %d", videoState); 1037d34e5713c9571859d12e9c2e83ce3946cacdd68eSantos Cordon mVideoState = videoState; 1038d34e5713c9571859d12e9c2e83ce3946cacdd68eSantos Cordon for (Listener l : mListeners) { 1039d34e5713c9571859d12e9c2e83ce3946cacdd68eSantos Cordon l.onVideoStateChanged(this, mVideoState); 1040d34e5713c9571859d12e9c2e83ce3946cacdd68eSantos Cordon } 1041aa07df84f279a87ad6370758c9d792a660f2cebbTyler Gunn } 1042aa07df84f279a87ad6370758c9d792a660f2cebbTyler Gunn 1043aa07df84f279a87ad6370758c9d792a660f2cebbTyler Gunn /** 10445c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad * Sets state to active (e.g., an ongoing connection where two or more parties can actively 1045542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad * communicate). 1046542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad */ 1047400cc48512dc69e940ad4d233a3b47ee9574601dSailesh Nepal public final void setActive() { 10485c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad checkImmutable(); 1049100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee setRingbackRequested(false); 1050b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad setState(STATE_ACTIVE); 1051542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad } 1052542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad 1053542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad /** 10545c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad * Sets state to ringing (e.g., an inbound ringing connection). 1055542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad */ 1056400cc48512dc69e940ad4d233a3b47ee9574601dSailesh Nepal public final void setRinging() { 10575c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad checkImmutable(); 1058b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad setState(STATE_RINGING); 1059542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad } 1060542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad 1061542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad /** 1062bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton * Sets state to initializing (this Connection is not yet ready to be used). 1063bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton */ 1064bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton public final void setInitializing() { 10655c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad checkImmutable(); 1066b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad setState(STATE_INITIALIZING); 1067bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton } 1068bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton 1069bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton /** 1070bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton * Sets state to initialized (the Connection has been set up and is now ready to be used). 1071bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton */ 1072bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton public final void setInitialized() { 10735c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad checkImmutable(); 1074b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad setState(STATE_NEW); 1075bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton } 1076bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton 1077bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton /** 10785c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad * Sets state to dialing (e.g., dialing an outbound connection). 1079542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad */ 1080400cc48512dc69e940ad4d233a3b47ee9574601dSailesh Nepal public final void setDialing() { 10815c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad checkImmutable(); 1082b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad setState(STATE_DIALING); 1083542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad } 1084542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad 1085542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad /** 1086542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad * Sets state to be on hold. 1087542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad */ 1088400cc48512dc69e940ad4d233a3b47ee9574601dSailesh Nepal public final void setOnHold() { 10895c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad checkImmutable(); 1090b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad setState(STATE_HOLDING); 1091542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad } 1092542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad 1093542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad /** 10945c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad * Sets the video connection provider. 1095b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad * @param videoProvider The video provider. 109627d1e257f3cba2d5954e5562db69035df9ecf290Tyler Gunn * @hide 10975ffbe8b850c2703b64617f0140d051a5412dd861Andrew Lee */ 1098b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad public final void setVideoProvider(VideoProvider videoProvider) { 10995c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad checkImmutable(); 1100b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad mVideoProvider = videoProvider; 1101d34e5713c9571859d12e9c2e83ce3946cacdd68eSantos Cordon for (Listener l : mListeners) { 1102b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad l.onVideoProviderChanged(this, videoProvider); 1103d34e5713c9571859d12e9c2e83ce3946cacdd68eSantos Cordon } 11045ffbe8b850c2703b64617f0140d051a5412dd861Andrew Lee } 11055ffbe8b850c2703b64617f0140d051a5412dd861Andrew Lee 1106b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad public final VideoProvider getVideoProvider() { 1107b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad return mVideoProvider; 1108a27a1938ab27aeb17144867b231f830622fa6ad4Andrew Lee } 1109a27a1938ab27aeb17144867b231f830622fa6ad4Andrew Lee 11105ffbe8b850c2703b64617f0140d051a5412dd861Andrew Lee /** 1111091768c3021d740b7d66846d36405c4d4c76cc56Sailesh Nepal * Sets state to disconnected. 1112542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad * 11137f3d41fd124dd7c4a8b72c1d48df08a8ee7209ecAndrew Lee * @param disconnectCause The reason for the disconnection, as specified by 1114b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad * {@link DisconnectCause}. 1115542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad */ 11167f3d41fd124dd7c4a8b72c1d48df08a8ee7209ecAndrew Lee public final void setDisconnected(DisconnectCause disconnectCause) { 11175c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad checkImmutable(); 11187f3d41fd124dd7c4a8b72c1d48df08a8ee7209ecAndrew Lee mDisconnectCause = disconnectCause; 1119b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad setState(STATE_DISCONNECTED); 1120f34519b4dd12d065c510b06922a196e8a3fd9885mike dooley Log.d(this, "Disconnected with cause %s", disconnectCause); 1121d34e5713c9571859d12e9c2e83ce3946cacdd68eSantos Cordon for (Listener l : mListeners) { 11227f3d41fd124dd7c4a8b72c1d48df08a8ee7209ecAndrew Lee l.onDisconnected(this, disconnectCause); 1123d34e5713c9571859d12e9c2e83ce3946cacdd68eSantos Cordon } 1124542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad } 1125542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad 1126542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad /** 11275c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad * Informs listeners that this {@code Connection} is in a post-dial wait state. This is done 11285c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad * when (a) the {@code Connection} is issuing a DTMF sequence; (b) it has encountered a "wait" 11295c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad * character; and (c) it wishes to inform the In-Call app that it is waiting for the end-user 11305c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad * to send an {@link #onPostDialContinue(boolean)} signal. 11315c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad * 11325c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad * @param remaining The DTMF character sequence remaining to be emitted once the 11335c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad * {@link #onPostDialContinue(boolean)} is received, including any "wait" characters 11345c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad * that remaining sequence may contain. 1135091768c3021d740b7d66846d36405c4d4c76cc56Sailesh Nepal */ 1136091768c3021d740b7d66846d36405c4d4c76cc56Sailesh Nepal public final void setPostDialWait(String remaining) { 11375c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad checkImmutable(); 1138d34e5713c9571859d12e9c2e83ce3946cacdd68eSantos Cordon for (Listener l : mListeners) { 1139d34e5713c9571859d12e9c2e83ce3946cacdd68eSantos Cordon l.onPostDialWait(this, remaining); 1140d34e5713c9571859d12e9c2e83ce3946cacdd68eSantos Cordon } 1141091768c3021d740b7d66846d36405c4d4c76cc56Sailesh Nepal } 1142091768c3021d740b7d66846d36405c4d4c76cc56Sailesh Nepal 1143091768c3021d740b7d66846d36405c4d4c76cc56Sailesh Nepal /** 114427d1c2d148fe377ca0d2744f0f85789a42c8f808Nancy Chen * Informs listeners that this {@code Connection} has processed a character in the post-dial 114527d1c2d148fe377ca0d2744f0f85789a42c8f808Nancy Chen * started state. This is done when (a) the {@code Connection} is issuing a DTMF sequence; 114627d1c2d148fe377ca0d2744f0f85789a42c8f808Nancy Chen * (b) it has encountered a "wait" character; and (c) it wishes to signal Telecom to play 114727d1c2d148fe377ca0d2744f0f85789a42c8f808Nancy Chen * the corresponding DTMF tone locally. 114827d1c2d148fe377ca0d2744f0f85789a42c8f808Nancy Chen * 114927d1c2d148fe377ca0d2744f0f85789a42c8f808Nancy Chen * @param nextChar The DTMF character that was just processed by the {@code Connection}. 115027d1c2d148fe377ca0d2744f0f85789a42c8f808Nancy Chen * 115127d1c2d148fe377ca0d2744f0f85789a42c8f808Nancy Chen * @hide 115227d1c2d148fe377ca0d2744f0f85789a42c8f808Nancy Chen */ 115327d1c2d148fe377ca0d2744f0f85789a42c8f808Nancy Chen public final void setNextPostDialWaitChar(char nextChar) { 115427d1c2d148fe377ca0d2744f0f85789a42c8f808Nancy Chen checkImmutable(); 115527d1c2d148fe377ca0d2744f0f85789a42c8f808Nancy Chen for (Listener l : mListeners) { 115627d1c2d148fe377ca0d2744f0f85789a42c8f808Nancy Chen l.onPostDialChar(this, nextChar); 115727d1c2d148fe377ca0d2744f0f85789a42c8f808Nancy Chen } 115827d1c2d148fe377ca0d2744f0f85789a42c8f808Nancy Chen } 115927d1c2d148fe377ca0d2744f0f85789a42c8f808Nancy Chen 116027d1c2d148fe377ca0d2744f0f85789a42c8f808Nancy Chen /** 1161f835897f9f799490de27653ae39141ba6bc14223Ihab Awad * Requests that the framework play a ringback tone. This is to be invoked by implementations 11625c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad * that do not play a ringback tone themselves in the connection's audio stream. 1163f835897f9f799490de27653ae39141ba6bc14223Ihab Awad * 1164f835897f9f799490de27653ae39141ba6bc14223Ihab Awad * @param ringback Whether the ringback tone is to be played. 1165f835897f9f799490de27653ae39141ba6bc14223Ihab Awad */ 1166100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee public final void setRingbackRequested(boolean ringback) { 11675c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad checkImmutable(); 1168100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee if (mRingbackRequested != ringback) { 1169100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee mRingbackRequested = ringback; 1170d34e5713c9571859d12e9c2e83ce3946cacdd68eSantos Cordon for (Listener l : mListeners) { 1171100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee l.onRingbackRequested(this, ringback); 1172d34e5713c9571859d12e9c2e83ce3946cacdd68eSantos Cordon } 1173d34e5713c9571859d12e9c2e83ce3946cacdd68eSantos Cordon } 1174f835897f9f799490de27653ae39141ba6bc14223Ihab Awad } 1175f835897f9f799490de27653ae39141ba6bc14223Ihab Awad 1176f835897f9f799490de27653ae39141ba6bc14223Ihab Awad /** 11775c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad * Sets the connection's capabilities as a bit mask of the {@code CAPABILITY_*} constants. 11781a7061ba950538c93d92c0448752a212039cc06aSailesh Nepal * 11795c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad * @param connectionCapabilities The new connection capabilities. 1180b693998fdfdd4498a33c4c69405f2708e4840aa7Santos Cordon */ 11815c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad public final void setConnectionCapabilities(int connectionCapabilities) { 11825c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad checkImmutable(); 11835c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad if (mConnectionCapabilities != connectionCapabilities) { 11845c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad mConnectionCapabilities = connectionCapabilities; 1185d34e5713c9571859d12e9c2e83ce3946cacdd68eSantos Cordon for (Listener l : mListeners) { 11865c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad l.onConnectionCapabilitiesChanged(this, mConnectionCapabilities); 1187d34e5713c9571859d12e9c2e83ce3946cacdd68eSantos Cordon } 1188d34e5713c9571859d12e9c2e83ce3946cacdd68eSantos Cordon } 1189b693998fdfdd4498a33c4c69405f2708e4840aa7Santos Cordon } 1190b693998fdfdd4498a33c4c69405f2708e4840aa7Santos Cordon 1191b693998fdfdd4498a33c4c69405f2708e4840aa7Santos Cordon /** 11927c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon * Tears down the Connection object. 1193b693998fdfdd4498a33c4c69405f2708e4840aa7Santos Cordon */ 119436a713431ceda2e5462c5dc5d1300f32acf9e63aEvan Charlton public final void destroy() { 1195229e3820dce98f64fd4834d5f421faec9a9d7026Jay Shrauner for (Listener l : mListeners) { 1196229e3820dce98f64fd4834d5f421faec9a9d7026Jay Shrauner l.onDestroyed(this); 1197d34e5713c9571859d12e9c2e83ce3946cacdd68eSantos Cordon } 1198b693998fdfdd4498a33c4c69405f2708e4840aa7Santos Cordon } 1199b693998fdfdd4498a33c4c69405f2708e4840aa7Santos Cordon 1200b693998fdfdd4498a33c4c69405f2708e4840aa7Santos Cordon /** 120133aaae4a07fdcce223fe74d96d751f4bffa6723aSailesh Nepal * Requests that the framework use VOIP audio mode for this connection. 120233aaae4a07fdcce223fe74d96d751f4bffa6723aSailesh Nepal * 120333aaae4a07fdcce223fe74d96d751f4bffa6723aSailesh Nepal * @param isVoip True if the audio mode is VOIP. 120433aaae4a07fdcce223fe74d96d751f4bffa6723aSailesh Nepal */ 120533aaae4a07fdcce223fe74d96d751f4bffa6723aSailesh Nepal public final void setAudioModeIsVoip(boolean isVoip) { 12065c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad checkImmutable(); 1207d34e5713c9571859d12e9c2e83ce3946cacdd68eSantos Cordon mAudioModeIsVoip = isVoip; 1208d34e5713c9571859d12e9c2e83ce3946cacdd68eSantos Cordon for (Listener l : mListeners) { 1209d34e5713c9571859d12e9c2e83ce3946cacdd68eSantos Cordon l.onAudioModeIsVoipChanged(this, isVoip); 1210d34e5713c9571859d12e9c2e83ce3946cacdd68eSantos Cordon } 121133aaae4a07fdcce223fe74d96d751f4bffa6723aSailesh Nepal } 121233aaae4a07fdcce223fe74d96d751f4bffa6723aSailesh Nepal 121333aaae4a07fdcce223fe74d96d751f4bffa6723aSailesh Nepal /** 1214e7ef59a77d55c9802cc7d919f7dd794bd5fea30eSailesh Nepal * Sets the label and icon status to display in the in-call UI. 1215e7ef59a77d55c9802cc7d919f7dd794bd5fea30eSailesh Nepal * 1216e7ef59a77d55c9802cc7d919f7dd794bd5fea30eSailesh Nepal * @param statusHints The status label and icon to set. 1217e7ef59a77d55c9802cc7d919f7dd794bd5fea30eSailesh Nepal */ 1218e7ef59a77d55c9802cc7d919f7dd794bd5fea30eSailesh Nepal public final void setStatusHints(StatusHints statusHints) { 12195c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad checkImmutable(); 1220d34e5713c9571859d12e9c2e83ce3946cacdd68eSantos Cordon mStatusHints = statusHints; 1221d34e5713c9571859d12e9c2e83ce3946cacdd68eSantos Cordon for (Listener l : mListeners) { 1222d34e5713c9571859d12e9c2e83ce3946cacdd68eSantos Cordon l.onStatusHintsChanged(this, statusHints); 1223d34e5713c9571859d12e9c2e83ce3946cacdd68eSantos Cordon } 1224e7ef59a77d55c9802cc7d919f7dd794bd5fea30eSailesh Nepal } 1225e7ef59a77d55c9802cc7d919f7dd794bd5fea30eSailesh Nepal 1226e7ef59a77d55c9802cc7d919f7dd794bd5fea30eSailesh Nepal /** 12277c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon * Sets the connections with which this connection can be conferenced. 12287c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon * 12297c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon * @param conferenceableConnections The set of connections this connection can conference with. 12307c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon */ 12317c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon public final void setConferenceableConnections(List<Connection> conferenceableConnections) { 12325c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad checkImmutable(); 12337c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon clearConferenceableList(); 12347c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon for (Connection c : conferenceableConnections) { 12357c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon // If statement checks for duplicates in input. It makes it N^2 but we're dealing with a 12367c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon // small amount of items here. 12376d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn if (!mConferenceables.contains(c)) { 12387c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon c.addConnectionListener(mConnectionDeathListener); 12396d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn mConferenceables.add(c); 12407c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon } 12417c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon } 12427c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon fireOnConferenceableConnectionsChanged(); 12437c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon } 12447c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon 12457c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon /** 12466d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn * Similar to {@link #setConferenceableConnections(java.util.List)}, sets a list of connections 12476d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn * or conferences with which this connection can be conferenced. 12486d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn * 12496d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn * @param conferenceables The conferenceables. 1250b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad */ 12516d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn public final void setConferenceables(List<IConferenceable> conferenceables) { 12526d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn clearConferenceableList(); 12536d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn for (IConferenceable c : conferenceables) { 12546d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn // If statement checks for duplicates in input. It makes it N^2 but we're dealing with a 12556d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn // small amount of items here. 12566d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn if (!mConferenceables.contains(c)) { 12576d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn if (c instanceof Connection) { 12586d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn Connection connection = (Connection) c; 12596d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn connection.addConnectionListener(mConnectionDeathListener); 12606d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn } else if (c instanceof Conference) { 12616d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn Conference conference = (Conference) c; 12626d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn conference.addListener(mConferenceDeathListener); 12636d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn } 12646d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn mConferenceables.add(c); 12656d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn } 12666d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn } 12676d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn fireOnConferenceableConnectionsChanged(); 12686d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn } 12696d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn 12706d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn /** 12716d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn * Returns the connections or conferences with which this connection can be conferenced. 12726d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn */ 12736d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn public final List<IConferenceable> getConferenceables() { 12746d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn return mUnmodifiableConferenceables; 1275b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad } 1276b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad 12778635c578f0408ca76cbaef5464d27bfde7450425Evan Charlton /* 1278823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon * @hide 1279823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon */ 1280823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon public final void setConnectionService(ConnectionService connectionService) { 12815c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad checkImmutable(); 1282823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon if (mConnectionService != null) { 1283823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon Log.e(this, new Exception(), "Trying to set ConnectionService on a connection " + 1284823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon "which is already associated with another ConnectionService."); 1285823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon } else { 1286823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon mConnectionService = connectionService; 1287823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon } 1288823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon } 1289823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon 1290823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon /** 1291823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon * @hide 1292823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon */ 1293823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon public final void unsetConnectionService(ConnectionService connectionService) { 1294823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon if (mConnectionService != connectionService) { 1295823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon Log.e(this, new Exception(), "Trying to remove ConnectionService from a Connection " + 1296823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon "that does not belong to the ConnectionService."); 1297823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon } else { 1298823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon mConnectionService = null; 1299823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon } 1300823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon } 1301823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon 1302823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon /** 1303af1b296a41f0b6e3af34e9c2c73bc1029bfa8b2aSantos Cordon * @hide 1304af1b296a41f0b6e3af34e9c2c73bc1029bfa8b2aSantos Cordon */ 1305af1b296a41f0b6e3af34e9c2c73bc1029bfa8b2aSantos Cordon public final ConnectionService getConnectionService() { 1306af1b296a41f0b6e3af34e9c2c73bc1029bfa8b2aSantos Cordon return mConnectionService; 1307af1b296a41f0b6e3af34e9c2c73bc1029bfa8b2aSantos Cordon } 1308af1b296a41f0b6e3af34e9c2c73bc1029bfa8b2aSantos Cordon 1309af1b296a41f0b6e3af34e9c2c73bc1029bfa8b2aSantos Cordon /** 1310823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon * Sets the conference that this connection is a part of. This will fail if the connection is 13115c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad * already part of a conference. {@link #resetConference} to un-set the conference first. 1312823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon * 1313823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon * @param conference The conference. 1314823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon * @return {@code true} if the conference was successfully set. 1315823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon * @hide 1316823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon */ 1317823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon public final boolean setConference(Conference conference) { 13185c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad checkImmutable(); 1319823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon // We check to see if it is already part of another conference. 13200159ac0cfe20e8f85ee4150e64d91392850f8a3fSantos Cordon if (mConference == null) { 1321823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon mConference = conference; 13220159ac0cfe20e8f85ee4150e64d91392850f8a3fSantos Cordon if (mConnectionService != null && mConnectionService.containsConference(conference)) { 13230159ac0cfe20e8f85ee4150e64d91392850f8a3fSantos Cordon fireConferenceChanged(); 13240159ac0cfe20e8f85ee4150e64d91392850f8a3fSantos Cordon } 1325823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon return true; 1326823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon } 1327823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon return false; 1328823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon } 1329823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon 1330823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon /** 1331823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon * Resets the conference that this connection is a part of. 1332823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon * @hide 1333823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon */ 1334823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon public final void resetConference() { 1335823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon if (mConference != null) { 13360159ac0cfe20e8f85ee4150e64d91392850f8a3fSantos Cordon Log.d(this, "Conference reset"); 1337823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon mConference = null; 1338823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon fireConferenceChanged(); 1339823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon } 1340823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon } 1341823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon 1342b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad /** 1343b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad * Notifies this Connection that the {@link #getAudioState()} property has a new value. 1344400cc48512dc69e940ad4d233a3b47ee9574601dSailesh Nepal * 13455c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad * @param state The new connection audio state. 1346400cc48512dc69e940ad4d233a3b47ee9574601dSailesh Nepal */ 1347354b2bd0fe8647bd5c7e28f3598b9b7414846124Nancy Chen public void onAudioStateChanged(AudioState state) {} 1348400cc48512dc69e940ad4d233a3b47ee9574601dSailesh Nepal 1349400cc48512dc69e940ad4d233a3b47ee9574601dSailesh Nepal /** 1350bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton * Notifies this Connection of an internal state change. This method is called after the 1351bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton * state is changed. 1352f835897f9f799490de27653ae39141ba6bc14223Ihab Awad * 1353b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad * @param state The new state, one of the {@code STATE_*} constants. 1354f835897f9f799490de27653ae39141ba6bc14223Ihab Awad */ 1355354b2bd0fe8647bd5c7e28f3598b9b7414846124Nancy Chen public void onStateChanged(int state) {} 1356f835897f9f799490de27653ae39141ba6bc14223Ihab Awad 1357f835897f9f799490de27653ae39141ba6bc14223Ihab Awad /** 1358542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad * Notifies this Connection of a request to play a DTMF tone. 1359542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad * 1360542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad * @param c A DTMF character. 1361542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad */ 1362f29511043e1c3bf750e28427410192c793363bf7Santos Cordon public void onPlayDtmfTone(char c) {} 1363542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad 1364542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad /** 1365542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad * Notifies this Connection of a request to stop any currently playing DTMF tones. 1366542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad */ 1367f29511043e1c3bf750e28427410192c793363bf7Santos Cordon public void onStopDtmfTone() {} 1368542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad 1369542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad /** 1370542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad * Notifies this Connection of a request to disconnect. 1371542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad */ 1372f29511043e1c3bf750e28427410192c793363bf7Santos Cordon public void onDisconnect() {} 1373542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad 1374542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad /** 13753b4b1dcb607b8932374a4bc8c9ab349b9bb68660Tyler Gunn * Notifies this Connection of a request to disconnect a participant of the conference managed 13763b4b1dcb607b8932374a4bc8c9ab349b9bb68660Tyler Gunn * by the connection. 13773b4b1dcb607b8932374a4bc8c9ab349b9bb68660Tyler Gunn * 13783b4b1dcb607b8932374a4bc8c9ab349b9bb68660Tyler Gunn * @param endpoint the {@link Uri} of the participant to disconnect. 13793b4b1dcb607b8932374a4bc8c9ab349b9bb68660Tyler Gunn * @hide 13803b4b1dcb607b8932374a4bc8c9ab349b9bb68660Tyler Gunn */ 13813b4b1dcb607b8932374a4bc8c9ab349b9bb68660Tyler Gunn public void onDisconnectConferenceParticipant(Uri endpoint) {} 13823b4b1dcb607b8932374a4bc8c9ab349b9bb68660Tyler Gunn 13833b4b1dcb607b8932374a4bc8c9ab349b9bb68660Tyler Gunn /** 13847c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon * Notifies this Connection of a request to separate from its parent conference. 1385b693998fdfdd4498a33c4c69405f2708e4840aa7Santos Cordon */ 1386f29511043e1c3bf750e28427410192c793363bf7Santos Cordon public void onSeparate() {} 1387b693998fdfdd4498a33c4c69405f2708e4840aa7Santos Cordon 1388b693998fdfdd4498a33c4c69405f2708e4840aa7Santos Cordon /** 1389542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad * Notifies this Connection of a request to abort. 1390542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad */ 1391f29511043e1c3bf750e28427410192c793363bf7Santos Cordon public void onAbort() {} 1392542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad 1393542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad /** 1394542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad * Notifies this Connection of a request to hold. 1395542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad */ 1396f29511043e1c3bf750e28427410192c793363bf7Santos Cordon public void onHold() {} 1397542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad 1398542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad /** 1399542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad * Notifies this Connection of a request to exit a hold state. 1400542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad */ 1401f29511043e1c3bf750e28427410192c793363bf7Santos Cordon public void onUnhold() {} 1402542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad 1403542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad /** 1404b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad * Notifies this Connection, which is in {@link #STATE_RINGING}, of 1405d34e5713c9571859d12e9c2e83ce3946cacdd68eSantos Cordon * a request to accept. 14068da4c3c11faf066b2b04ba853f03be6f1c4af5d8Andrew Lee * 14075c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad * @param videoState The video state in which to answer the connection. 1408be74de0978a7eaa577f6b61902b550a3161aff8bTyler Gunn * @hide 1409542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad */ 1410f29511043e1c3bf750e28427410192c793363bf7Santos Cordon public void onAnswer(int videoState) {} 1411542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad 1412542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad /** 1413b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad * Notifies this Connection, which is in {@link #STATE_RINGING}, of 1414be74de0978a7eaa577f6b61902b550a3161aff8bTyler Gunn * a request to accept. 1415be74de0978a7eaa577f6b61902b550a3161aff8bTyler Gunn */ 1416be74de0978a7eaa577f6b61902b550a3161aff8bTyler Gunn public void onAnswer() { 1417be74de0978a7eaa577f6b61902b550a3161aff8bTyler Gunn onAnswer(VideoProfile.VideoState.AUDIO_ONLY); 1418be74de0978a7eaa577f6b61902b550a3161aff8bTyler Gunn } 1419be74de0978a7eaa577f6b61902b550a3161aff8bTyler Gunn 1420be74de0978a7eaa577f6b61902b550a3161aff8bTyler Gunn /** 1421be74de0978a7eaa577f6b61902b550a3161aff8bTyler Gunn * Notifies this Connection, which is in {@link #STATE_RINGING}, of 1422d34e5713c9571859d12e9c2e83ce3946cacdd68eSantos Cordon * a request to reject. 1423542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad */ 1424f29511043e1c3bf750e28427410192c793363bf7Santos Cordon public void onReject() {} 1425542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad 14266dea4aceba8f69ee4be346ec356d277a3c153f3dEvan Charlton /** 14276dea4aceba8f69ee4be346ec356d277a3c153f3dEvan Charlton * Notifies this Connection whether the user wishes to proceed with the post-dial DTMF codes. 14286dea4aceba8f69ee4be346ec356d277a3c153f3dEvan Charlton */ 1429f29511043e1c3bf750e28427410192c793363bf7Santos Cordon public void onPostDialContinue(boolean proceed) {} 14306dea4aceba8f69ee4be346ec356d277a3c153f3dEvan Charlton 1431b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad static String toLogSafePhoneNumber(String number) { 1432b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad // For unknown number, log empty string. 1433b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad if (number == null) { 1434b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad return ""; 1435b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad } 1436b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad 1437b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad if (PII_DEBUG) { 1438b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad // When PII_DEBUG is true we emit PII. 1439b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad return number; 1440b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad } 1441b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad 1442b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad // Do exactly same thing as Uri#toSafeString() does, which will enable us to compare 1443b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad // sanitized phone numbers. 1444b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad StringBuilder builder = new StringBuilder(); 1445b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad for (int i = 0; i < number.length(); i++) { 1446b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad char c = number.charAt(i); 1447b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad if (c == '-' || c == '@' || c == '.') { 1448b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad builder.append(c); 1449b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad } else { 1450b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad builder.append('x'); 1451b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad } 1452b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad } 1453b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad return builder.toString(); 1454b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad } 1455b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad 1456542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad private void setState(int state) { 14575c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad checkImmutable(); 14586107bab041fb7d851fbf865b7310d294aae970c8Ihab Awad if (mState == STATE_DISCONNECTED && mState != state) { 14596107bab041fb7d851fbf865b7310d294aae970c8Ihab Awad Log.d(this, "Connection already DISCONNECTED; cannot transition out of this state."); 1460bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton return; 1461400cc48512dc69e940ad4d233a3b47ee9574601dSailesh Nepal } 1462bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton if (mState != state) { 1463bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton Log.d(this, "setState: %s", stateToString(state)); 1464bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton mState = state; 1465354b2bd0fe8647bd5c7e28f3598b9b7414846124Nancy Chen onStateChanged(state); 1466bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton for (Listener l : mListeners) { 1467bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton l.onStateChanged(this, state); 1468bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton } 1469bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton } 1470bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton } 1471bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton 1472cf7020b7e84c1f5190db7167d70cb0675cd3332fSailesh Nepal private static class FailureSignalingConnection extends Connection { 147390e34e324cbe22f18680809cbc33caf63b320cb4Ihab Awad private boolean mImmutable = false; 14747f3d41fd124dd7c4a8b72c1d48df08a8ee7209ecAndrew Lee public FailureSignalingConnection(DisconnectCause disconnectCause) { 14757f3d41fd124dd7c4a8b72c1d48df08a8ee7209ecAndrew Lee setDisconnected(disconnectCause); 147690e34e324cbe22f18680809cbc33caf63b320cb4Ihab Awad mImmutable = true; 14776107bab041fb7d851fbf865b7310d294aae970c8Ihab Awad } 14785c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad 14795c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad public void checkImmutable() { 148090e34e324cbe22f18680809cbc33caf63b320cb4Ihab Awad if (mImmutable) { 148190e34e324cbe22f18680809cbc33caf63b320cb4Ihab Awad throw new UnsupportedOperationException("Connection is immutable"); 148290e34e324cbe22f18680809cbc33caf63b320cb4Ihab Awad } 14835c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad } 14846107bab041fb7d851fbf865b7310d294aae970c8Ihab Awad } 14856107bab041fb7d851fbf865b7310d294aae970c8Ihab Awad 1486bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton /** 14876107bab041fb7d851fbf865b7310d294aae970c8Ihab Awad * Return a {@code Connection} which represents a failed connection attempt. The returned 14887f3d41fd124dd7c4a8b72c1d48df08a8ee7209ecAndrew Lee * {@code Connection} will have a {@link android.telecom.DisconnectCause} and as specified, 14897f3d41fd124dd7c4a8b72c1d48df08a8ee7209ecAndrew Lee * and a {@link #getState()} of {@link #STATE_DISCONNECTED}. 14906107bab041fb7d851fbf865b7310d294aae970c8Ihab Awad * <p> 14916107bab041fb7d851fbf865b7310d294aae970c8Ihab Awad * The returned {@code Connection} can be assumed to {@link #destroy()} itself when appropriate, 14926107bab041fb7d851fbf865b7310d294aae970c8Ihab Awad * so users of this method need not maintain a reference to its return value to destroy it. 1493bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton * 14947f3d41fd124dd7c4a8b72c1d48df08a8ee7209ecAndrew Lee * @param disconnectCause The disconnect cause, ({@see android.telecomm.DisconnectCause}). 14956107bab041fb7d851fbf865b7310d294aae970c8Ihab Awad * @return A {@code Connection} which indicates failure. 1496bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton */ 14977f3d41fd124dd7c4a8b72c1d48df08a8ee7209ecAndrew Lee public static Connection createFailedConnection(DisconnectCause disconnectCause) { 14987f3d41fd124dd7c4a8b72c1d48df08a8ee7209ecAndrew Lee return new FailureSignalingConnection(disconnectCause); 1499bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton } 1500bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton 1501bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton /** 15025c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad * Override to throw an {@link UnsupportedOperationException} if this {@code Connection} is 15035c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad * not intended to be mutated, e.g., if it is a marker for failure. Only for framework use; 15045c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad * this should never be un-@hide-den. 15055c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad * 15065c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad * @hide 15075c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad */ 15085c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad public void checkImmutable() {} 15095c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad 15105c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad /** 15116107bab041fb7d851fbf865b7310d294aae970c8Ihab Awad * Return a {@code Connection} which represents a canceled connection attempt. The returned 15126107bab041fb7d851fbf865b7310d294aae970c8Ihab Awad * {@code Connection} will have state {@link #STATE_DISCONNECTED}, and cannot be moved out of 15136107bab041fb7d851fbf865b7310d294aae970c8Ihab Awad * that state. This connection should not be used for anything, and no other 15146107bab041fb7d851fbf865b7310d294aae970c8Ihab Awad * {@code Connection}s should be attempted. 15156107bab041fb7d851fbf865b7310d294aae970c8Ihab Awad * <p> 15166107bab041fb7d851fbf865b7310d294aae970c8Ihab Awad * so users of this method need not maintain a reference to its return value to destroy it. 1517bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton * 15185c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad * @return A {@code Connection} which indicates that the underlying connection should 15195c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad * be canceled. 1520bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton */ 1521b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad public static Connection createCanceledConnection() { 15227f3d41fd124dd7c4a8b72c1d48df08a8ee7209ecAndrew Lee return new FailureSignalingConnection(new DisconnectCause(DisconnectCause.CANCELED)); 1523542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad } 15247c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon 15255c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad private final void fireOnConferenceableConnectionsChanged() { 15267c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon for (Listener l : mListeners) { 15276d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn l.onConferenceablesChanged(this, getConferenceables()); 15287c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon } 15297c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon } 15307c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon 1531823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon private final void fireConferenceChanged() { 1532823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon for (Listener l : mListeners) { 1533823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon l.onConferenceChanged(this, mConference); 1534823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon } 1535823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon } 1536823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon 15377c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon private final void clearConferenceableList() { 15386d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn for (IConferenceable c : mConferenceables) { 15396d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn if (c instanceof Connection) { 15406d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn Connection connection = (Connection) c; 15416d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn connection.removeConnectionListener(mConnectionDeathListener); 15426d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn } else if (c instanceof Conference) { 15436d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn Conference conference = (Conference) c; 15446d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn conference.removeListener(mConferenceDeathListener); 15456d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn } 15467c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon } 15476d76ca0438c2cb7a7d5d91992db819c063c0a57bTyler Gunn mConferenceables.clear(); 15487c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon } 15493bffcf78b5e4bd8b60543126fc0bdb09808f28f5Tyler Gunn 15503bffcf78b5e4bd8b60543126fc0bdb09808f28f5Tyler Gunn /** 155117455a3d39350a39eb995897929977d793358365Anthony Lee * Notifies listeners that the merge request failed. 155217455a3d39350a39eb995897929977d793358365Anthony Lee * 155317455a3d39350a39eb995897929977d793358365Anthony Lee * @hide 155417455a3d39350a39eb995897929977d793358365Anthony Lee */ 155517455a3d39350a39eb995897929977d793358365Anthony Lee protected final void notifyConferenceMergeFailed() { 155617455a3d39350a39eb995897929977d793358365Anthony Lee for (Listener l : mListeners) { 155717455a3d39350a39eb995897929977d793358365Anthony Lee l.onConferenceMergeFailed(this); 155817455a3d39350a39eb995897929977d793358365Anthony Lee } 155917455a3d39350a39eb995897929977d793358365Anthony Lee } 156017455a3d39350a39eb995897929977d793358365Anthony Lee 156117455a3d39350a39eb995897929977d793358365Anthony Lee /** 1562ab4650c4563cd46e65ac37f924fee8febfd759c6Tyler Gunn * Notifies listeners of a change to conference participant(s). 15633bffcf78b5e4bd8b60543126fc0bdb09808f28f5Tyler Gunn * 1564ab4650c4563cd46e65ac37f924fee8febfd759c6Tyler Gunn * @param conferenceParticipants The participants. 15653bffcf78b5e4bd8b60543126fc0bdb09808f28f5Tyler Gunn * @hide 15663bffcf78b5e4bd8b60543126fc0bdb09808f28f5Tyler Gunn */ 1567ab4650c4563cd46e65ac37f924fee8febfd759c6Tyler Gunn protected final void updateConferenceParticipants( 1568ab4650c4563cd46e65ac37f924fee8febfd759c6Tyler Gunn List<ConferenceParticipant> conferenceParticipants) { 15693bffcf78b5e4bd8b60543126fc0bdb09808f28f5Tyler Gunn for (Listener l : mListeners) { 1570ab4650c4563cd46e65ac37f924fee8febfd759c6Tyler Gunn l.onConferenceParticipantsChanged(this, conferenceParticipants); 15713bffcf78b5e4bd8b60543126fc0bdb09808f28f5Tyler Gunn } 15723bffcf78b5e4bd8b60543126fc0bdb09808f28f5Tyler Gunn } 15738a2b1199a6db0c6f2493e96e25ec1d89e3f62769Tyler Gunn 15748a2b1199a6db0c6f2493e96e25ec1d89e3f62769Tyler Gunn /** 15758a2b1199a6db0c6f2493e96e25ec1d89e3f62769Tyler Gunn * Notifies listeners that a conference call has been started. 15761cf9b6bec12c027a0d551540a6e01f3ac2d0a9d4Jay Shrauner * @hide 15778a2b1199a6db0c6f2493e96e25ec1d89e3f62769Tyler Gunn */ 15788a2b1199a6db0c6f2493e96e25ec1d89e3f62769Tyler Gunn protected void notifyConferenceStarted() { 15798a2b1199a6db0c6f2493e96e25ec1d89e3f62769Tyler Gunn for (Listener l : mListeners) { 15808a2b1199a6db0c6f2493e96e25ec1d89e3f62769Tyler Gunn l.onConferenceStarted(); 15818a2b1199a6db0c6f2493e96e25ec1d89e3f62769Tyler Gunn } 15828a2b1199a6db0c6f2493e96e25ec1d89e3f62769Tyler Gunn } 1583542e0ea8bfa60f09c33e4be366adf8681c25d0bfIhab Awad} 1584