152d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon/*
252d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon * Copyright (C) 2014 The Android Open Source Project
352d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon *
452d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon * Licensed under the Apache License, Version 2.0 (the "License");
552d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon * you may not use this file except in compliance with the License.
652d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon * You may obtain a copy of the License at
752d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon *
852d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon *      http://www.apache.org/licenses/LICENSE-2.0
952d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon *
1052d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon * Unless required by applicable law or agreed to in writing, software
1152d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon * distributed under the License is distributed on an "AS IS" BASIS,
1252d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1352d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon * See the License for the specific language governing permissions and
1452d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon * limitations under the License.
1552d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon */
1652d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon
17ef9f6f957d897ea0ed82114185b8fa3fefd4917bTyler Gunnpackage android.telecom;
1852d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon
19ef9f6f957d897ea0ed82114185b8fa3fefd4917bTyler Gunnimport com.android.internal.telecom.IConnectionService;
20ef9f6f957d897ea0ed82114185b8fa3fefd4917bTyler Gunnimport com.android.internal.telecom.IVideoCallback;
21ef9f6f957d897ea0ed82114185b8fa3fefd4917bTyler Gunnimport com.android.internal.telecom.IVideoProvider;
22b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad
2357006aa82a69740df73415a456d31993e2785e24Hall Liuimport android.annotation.NonNull;
246b7f955c2d9b231660b8c54f8ef8e8e6ad802625Santos Cordonimport android.annotation.Nullable;
254af5935c71f1e31ef1aec27661c4ef60545a0924Yorke Leeimport android.annotation.SystemApi;
26295f5d7777ba63836bf75cb4de15bdaae06dfc1fTyler Gunnimport android.hardware.camera2.CameraManager;
2752d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordonimport android.net.Uri;
286b7f955c2d9b231660b8c54f8ef8e8e6ad802625Santos Cordonimport android.os.Bundle;
29011728fc3a4368b601844d225d1f37bf48ea5735Andrew Leeimport android.os.Handler;
30a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awadimport android.os.IBinder;
3152d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordonimport android.os.RemoteException;
32a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awadimport android.view.Surface;
3352d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon
347c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordonimport java.util.ArrayList;
35f4669dffd5d604f227ceb74c6ea86ee78a882e73Sailesh Nepalimport java.util.Collections;
365d0410fa7c2dead7906780551ba4aa0305021cefIhab Awadimport java.util.List;
3752d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordonimport java.util.Set;
38f4669dffd5d604f227ceb74c6ea86ee78a882e73Sailesh Nepalimport java.util.concurrent.ConcurrentHashMap;
3952d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon
4052d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon/**
41b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad * A connection provided to a {@link ConnectionService} by another {@code ConnectionService}
42b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad * running in a different process.
43b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad *
44b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad * @see ConnectionService#createRemoteOutgoingConnection(PhoneAccountHandle, ConnectionRequest)
45b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad * @see ConnectionService#createRemoteIncomingConnection(PhoneAccountHandle, ConnectionRequest)
4652d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon */
4752d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordonpublic final class RemoteConnection {
485d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad
49895d4b8f63389b79974dfd3e36f1ab10b5ceb4dcSantos Cordon    /**
50895d4b8f63389b79974dfd3e36f1ab10b5ceb4dcSantos Cordon     * Callback base class for {@link RemoteConnection}.
51895d4b8f63389b79974dfd3e36f1ab10b5ceb4dcSantos Cordon     */
52100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee    public static abstract class Callback {
535d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad        /**
545d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad         * Invoked when the state of this {@code RemoteConnection} has changed. See
555d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad         * {@link #getState()}.
565d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad         *
575d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad         * @param connection The {@code RemoteConnection} invoking this method.
585d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad         * @param state The new state of the {@code RemoteConnection}.
595d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad         */
60bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton        public void onStateChanged(RemoteConnection connection, int state) {}
615d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad
625d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad        /**
635d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad         * Invoked when this {@code RemoteConnection} is disconnected.
645d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad         *
655d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad         * @param connection The {@code RemoteConnection} invoking this method.
667f3d41fd124dd7c4a8b72c1d48df08a8ee7209ecAndrew Lee         * @param disconnectCause The ({@see DisconnectCause}) associated with this failed
677f3d41fd124dd7c4a8b72c1d48df08a8ee7209ecAndrew Lee         *     connection.
685d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad         */
695d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad        public void onDisconnected(
705d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad                RemoteConnection connection,
717f3d41fd124dd7c4a8b72c1d48df08a8ee7209ecAndrew Lee                DisconnectCause disconnectCause) {}
725d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad
735d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad        /**
745d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad         * Invoked when this {@code RemoteConnection} is requesting ringback. See
75100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee         * {@link #isRingbackRequested()}.
765d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad         *
775d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad         * @param connection The {@code RemoteConnection} invoking this method.
785d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad         * @param ringback Whether the {@code RemoteConnection} is requesting ringback.
795d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad         */
80100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee        public void onRingbackRequested(RemoteConnection connection, boolean ringback) {}
815d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad
825d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad        /**
835d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad         * Indicates that the call capabilities of this {@code RemoteConnection} have changed.
845c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad         * See {@link #getConnectionCapabilities()}.
855d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad         *
865d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad         * @param connection The {@code RemoteConnection} invoking this method.
875c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad         * @param connectionCapabilities The new capabilities of the {@code RemoteConnection}.
885d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad         */
895c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        public void onConnectionCapabilitiesChanged(
905c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad                RemoteConnection connection,
915c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad                int connectionCapabilities) {}
925d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad
935d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad        /**
94720c664401081ca00e56c7eef12641ae792da530Tyler Gunn         * Indicates that the call properties of this {@code RemoteConnection} have changed.
95720c664401081ca00e56c7eef12641ae792da530Tyler Gunn         * See {@link #getConnectionProperties()}.
96720c664401081ca00e56c7eef12641ae792da530Tyler Gunn         *
97720c664401081ca00e56c7eef12641ae792da530Tyler Gunn         * @param connection The {@code RemoteConnection} invoking this method.
98720c664401081ca00e56c7eef12641ae792da530Tyler Gunn         * @param connectionProperties The new properties of the {@code RemoteConnection}.
99720c664401081ca00e56c7eef12641ae792da530Tyler Gunn         */
100720c664401081ca00e56c7eef12641ae792da530Tyler Gunn        public void onConnectionPropertiesChanged(
101720c664401081ca00e56c7eef12641ae792da530Tyler Gunn                RemoteConnection connection,
102720c664401081ca00e56c7eef12641ae792da530Tyler Gunn                int connectionProperties) {}
103720c664401081ca00e56c7eef12641ae792da530Tyler Gunn
104720c664401081ca00e56c7eef12641ae792da530Tyler Gunn        /**
1055d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad         * Invoked when the post-dial sequence in the outgoing {@code Connection} has reached a
1065d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad         * pause character. This causes the post-dial signals to stop pending user confirmation. An
1075d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad         * implementation should present this choice to the user and invoke
108b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * {@link RemoteConnection#postDialContinue(boolean)} when the user makes the choice.
1095d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad         *
1105d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad         * @param connection The {@code RemoteConnection} invoking this method.
1115d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad         * @param remainingPostDialSequence The post-dial characters that remain to be sent.
1125d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad         */
1135d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad        public void onPostDialWait(RemoteConnection connection, String remainingPostDialSequence) {}
1145d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad
1155d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad        /**
11627d1c2d148fe377ca0d2744f0f85789a42c8f808Nancy Chen         * Invoked when the post-dial sequence in the outgoing {@code Connection} has processed
11727d1c2d148fe377ca0d2744f0f85789a42c8f808Nancy Chen         * a character.
11827d1c2d148fe377ca0d2744f0f85789a42c8f808Nancy Chen         *
11927d1c2d148fe377ca0d2744f0f85789a42c8f808Nancy Chen         * @param connection The {@code RemoteConnection} invoking this method.
12027d1c2d148fe377ca0d2744f0f85789a42c8f808Nancy Chen         * @param nextChar The character being processed.
12127d1c2d148fe377ca0d2744f0f85789a42c8f808Nancy Chen         */
12227d1c2d148fe377ca0d2744f0f85789a42c8f808Nancy Chen        public void onPostDialChar(RemoteConnection connection, char nextChar) {}
12327d1c2d148fe377ca0d2744f0f85789a42c8f808Nancy Chen
12427d1c2d148fe377ca0d2744f0f85789a42c8f808Nancy Chen        /**
1255d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad         * Indicates that the VOIP audio status of this {@code RemoteConnection} has changed.
126100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee         * See {@link #isVoipAudioMode()}.
1275d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad         *
1285d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad         * @param connection The {@code RemoteConnection} invoking this method.
1295d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad         * @param isVoip Whether the new audio state of the {@code RemoteConnection} is VOIP.
1305d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad         */
131100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee        public void onVoipAudioChanged(RemoteConnection connection, boolean isVoip) {}
1325d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad
1335d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad        /**
1345d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad         * Indicates that the status hints of this {@code RemoteConnection} have changed. See
1355d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad         * {@link #getStatusHints()} ()}.
1365d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad         *
1375d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad         * @param connection The {@code RemoteConnection} invoking this method.
1385d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad         * @param statusHints The new status hints of the {@code RemoteConnection}.
1395d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad         */
140bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton        public void onStatusHintsChanged(RemoteConnection connection, StatusHints statusHints) {}
1415d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad
1425d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad        /**
143100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee         * Indicates that the address (e.g., phone number) of this {@code RemoteConnection} has
144100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee         * changed. See {@link #getAddress()} and {@link #getAddressPresentation()}.
1455d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad         *
1465d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad         * @param connection The {@code RemoteConnection} invoking this method.
147100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee         * @param address The new address of the {@code RemoteConnection}.
148100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee         * @param presentation The presentation requirements for the address.
149ef9f6f957d897ea0ed82114185b8fa3fefd4917bTyler Gunn         *        See {@link TelecomManager} for valid values.
1505d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad         */
151100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee        public void onAddressChanged(RemoteConnection connection, Uri address, int presentation) {}
1525d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad
1535d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad        /**
1545d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad         * Indicates that the caller display name of this {@code RemoteConnection} has changed.
1555d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad         * See {@link #getCallerDisplayName()} and {@link #getCallerDisplayNamePresentation()}.
1565d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad         *
1575d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad         * @param connection The {@code RemoteConnection} invoking this method.
1585d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad         * @param callerDisplayName The new caller display name of the {@code RemoteConnection}.
1599d568c01db1f90fbe9cbff1d9385e7e7b809e066Nancy Chen         * @param presentation The presentation requirements for the handle.
160ef9f6f957d897ea0ed82114185b8fa3fefd4917bTyler Gunn         *        See {@link TelecomManager} for valid values.
1615d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad         */
162bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton        public void onCallerDisplayNameChanged(
163bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton                RemoteConnection connection, String callerDisplayName, int presentation) {}
1645d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad
1655d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad        /**
1665d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad         * Indicates that the video state of this {@code RemoteConnection} has changed.
1675d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad         * See {@link #getVideoState()}.
1685d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad         *
1695d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad         * @param connection The {@code RemoteConnection} invoking this method.
1705d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad         * @param videoState The new video state of the {@code RemoteConnection}.
1715d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad         */
172bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton        public void onVideoStateChanged(RemoteConnection connection, int videoState) {}
1735d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad
1745d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad        /**
1755d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad         * Indicates that this {@code RemoteConnection} has been destroyed. No further requests
1765d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad         * should be made to the {@code RemoteConnection}, and references to it should be cleared.
1775d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad         *
1785d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad         * @param connection The {@code RemoteConnection} invoking this method.
1795d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad         */
180bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton        public void onDestroyed(RemoteConnection connection) {}
181b8e85c74e5910a461078704048d67f82b216508cIhab Awad
182b8e85c74e5910a461078704048d67f82b216508cIhab Awad        /**
183b8e85c74e5910a461078704048d67f82b216508cIhab Awad         * Indicates that the {@code RemoteConnection}s with which this {@code RemoteConnection}
184b8e85c74e5910a461078704048d67f82b216508cIhab Awad         * may be asked to create a conference has changed.
185b8e85c74e5910a461078704048d67f82b216508cIhab Awad         *
186b8e85c74e5910a461078704048d67f82b216508cIhab Awad         * @param connection The {@code RemoteConnection} invoking this method.
187b8e85c74e5910a461078704048d67f82b216508cIhab Awad         * @param conferenceableConnections The {@code RemoteConnection}s with which this
188b8e85c74e5910a461078704048d67f82b216508cIhab Awad         *         {@code RemoteConnection} may be asked to create a conference.
189b8e85c74e5910a461078704048d67f82b216508cIhab Awad         */
1907c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon        public void onConferenceableConnectionsChanged(
191b8e85c74e5910a461078704048d67f82b216508cIhab Awad                RemoteConnection connection,
192b8e85c74e5910a461078704048d67f82b216508cIhab Awad                List<RemoteConnection> conferenceableConnections) {}
193b8e85c74e5910a461078704048d67f82b216508cIhab Awad
194b8e85c74e5910a461078704048d67f82b216508cIhab Awad        /**
195a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad         * Indicates that the {@code VideoProvider} associated with this {@code RemoteConnection}
196a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad         * has changed.
197a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad         *
198a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad         * @param connection The {@code RemoteConnection} invoking this method.
199a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad         * @param videoProvider The new {@code VideoProvider} associated with this
200a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad         *         {@code RemoteConnection}.
201a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad         */
202a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad        public void onVideoProviderChanged(
203a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad                RemoteConnection connection, VideoProvider videoProvider) {}
204a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad
205a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad        /**
206b8e85c74e5910a461078704048d67f82b216508cIhab Awad         * Indicates that the {@code RemoteConference} that this {@code RemoteConnection} is a part
207b8e85c74e5910a461078704048d67f82b216508cIhab Awad         * of has changed.
208b8e85c74e5910a461078704048d67f82b216508cIhab Awad         *
209b8e85c74e5910a461078704048d67f82b216508cIhab Awad         * @param connection The {@code RemoteConnection} invoking this method.
210b8e85c74e5910a461078704048d67f82b216508cIhab Awad         * @param conference The {@code RemoteConference} of which this {@code RemoteConnection} is
211b8e85c74e5910a461078704048d67f82b216508cIhab Awad         *         a part, which may be {@code null}.
212b8e85c74e5910a461078704048d67f82b216508cIhab Awad         */
213b8e85c74e5910a461078704048d67f82b216508cIhab Awad        public void onConferenceChanged(
214b8e85c74e5910a461078704048d67f82b216508cIhab Awad                RemoteConnection connection,
215b8e85c74e5910a461078704048d67f82b216508cIhab Awad                RemoteConference conference) {}
2166b7f955c2d9b231660b8c54f8ef8e8e6ad802625Santos Cordon
2176b7f955c2d9b231660b8c54f8ef8e8e6ad802625Santos Cordon        /**
218895d4b8f63389b79974dfd3e36f1ab10b5ceb4dcSantos Cordon         * Handles changes to the {@code RemoteConnection} extras.
2196b7f955c2d9b231660b8c54f8ef8e8e6ad802625Santos Cordon         *
2206b7f955c2d9b231660b8c54f8ef8e8e6ad802625Santos Cordon         * @param connection The {@code RemoteConnection} invoking this method.
2216b7f955c2d9b231660b8c54f8ef8e8e6ad802625Santos Cordon         * @param extras The extras containing other information associated with the connection.
2226b7f955c2d9b231660b8c54f8ef8e8e6ad802625Santos Cordon         */
2236b7f955c2d9b231660b8c54f8ef8e8e6ad802625Santos Cordon        public void onExtrasChanged(RemoteConnection connection, @Nullable Bundle extras) {}
224bd1eb1f105e99d55fe87d758e8eafbe55a221a30Tyler Gunn
225bd1eb1f105e99d55fe87d758e8eafbe55a221a30Tyler Gunn        /**
226bd1eb1f105e99d55fe87d758e8eafbe55a221a30Tyler Gunn         * Handles a connection event propagated to this {@link RemoteConnection}.
227876dbfb4767da4a2ba5459d5b78fb6eb55e4516fTyler Gunn         * <p>
228876dbfb4767da4a2ba5459d5b78fb6eb55e4516fTyler Gunn         * Connection events originate from {@link Connection#sendConnectionEvent(String, Bundle)}.
229bd1eb1f105e99d55fe87d758e8eafbe55a221a30Tyler Gunn         *
230bd1eb1f105e99d55fe87d758e8eafbe55a221a30Tyler Gunn         * @param connection The {@code RemoteConnection} invoking this method.
231bd1eb1f105e99d55fe87d758e8eafbe55a221a30Tyler Gunn         * @param event The connection event.
232876dbfb4767da4a2ba5459d5b78fb6eb55e4516fTyler Gunn         * @param extras Extras associated with the event.
233bd1eb1f105e99d55fe87d758e8eafbe55a221a30Tyler Gunn         */
234876dbfb4767da4a2ba5459d5b78fb6eb55e4516fTyler Gunn        public void onConnectionEvent(RemoteConnection connection, String event, Bundle extras) {}
23557006aa82a69740df73415a456d31993e2785e24Hall Liu
23657006aa82a69740df73415a456d31993e2785e24Hall Liu        /**
23757006aa82a69740df73415a456d31993e2785e24Hall Liu         * Indicates that a RTT session was successfully established on this
23857006aa82a69740df73415a456d31993e2785e24Hall Liu         * {@link RemoteConnection}. See {@link Connection#sendRttInitiationSuccess()}.
23957006aa82a69740df73415a456d31993e2785e24Hall Liu         * @hide
24057006aa82a69740df73415a456d31993e2785e24Hall Liu         * @param connection The {@code RemoteConnection} invoking this method.
24157006aa82a69740df73415a456d31993e2785e24Hall Liu         */
24257006aa82a69740df73415a456d31993e2785e24Hall Liu        public void onRttInitiationSuccess(RemoteConnection connection) {}
24357006aa82a69740df73415a456d31993e2785e24Hall Liu
24457006aa82a69740df73415a456d31993e2785e24Hall Liu        /**
24557006aa82a69740df73415a456d31993e2785e24Hall Liu         * Indicates that a RTT session failed to be established on this
24657006aa82a69740df73415a456d31993e2785e24Hall Liu         * {@link RemoteConnection}. See {@link Connection#sendRttInitiationFailure()}.
24757006aa82a69740df73415a456d31993e2785e24Hall Liu         * @hide
24857006aa82a69740df73415a456d31993e2785e24Hall Liu         * @param connection The {@code RemoteConnection} invoking this method.
24957006aa82a69740df73415a456d31993e2785e24Hall Liu         * @param reason One of the reason codes defined in {@link Connection.RttModifyStatus},
25057006aa82a69740df73415a456d31993e2785e24Hall Liu         *               with the exception of
25157006aa82a69740df73415a456d31993e2785e24Hall Liu         *               {@link Connection.RttModifyStatus#SESSION_MODIFY_REQUEST_SUCCESS}.
25257006aa82a69740df73415a456d31993e2785e24Hall Liu         */
25357006aa82a69740df73415a456d31993e2785e24Hall Liu        public void onRttInitiationFailure(RemoteConnection connection, int reason) {}
25457006aa82a69740df73415a456d31993e2785e24Hall Liu
25557006aa82a69740df73415a456d31993e2785e24Hall Liu        /**
25657006aa82a69740df73415a456d31993e2785e24Hall Liu         * Indicates that an established RTT session was terminated remotely on this
25757006aa82a69740df73415a456d31993e2785e24Hall Liu         * {@link RemoteConnection}. See {@link Connection#sendRttSessionRemotelyTerminated()}
25857006aa82a69740df73415a456d31993e2785e24Hall Liu         * @hide
25957006aa82a69740df73415a456d31993e2785e24Hall Liu         * @param connection The {@code RemoteConnection} invoking this method.
26057006aa82a69740df73415a456d31993e2785e24Hall Liu         */
26157006aa82a69740df73415a456d31993e2785e24Hall Liu        public void onRttSessionRemotelyTerminated(RemoteConnection connection) {}
26257006aa82a69740df73415a456d31993e2785e24Hall Liu
26357006aa82a69740df73415a456d31993e2785e24Hall Liu        /**
26457006aa82a69740df73415a456d31993e2785e24Hall Liu         * Indicates that the remote user on this {@link RemoteConnection} has requested an upgrade
26557006aa82a69740df73415a456d31993e2785e24Hall Liu         * to an RTT session. See {@link Connection#sendRemoteRttRequest()}
26657006aa82a69740df73415a456d31993e2785e24Hall Liu         * @hide
26757006aa82a69740df73415a456d31993e2785e24Hall Liu         * @param connection The {@code RemoteConnection} invoking this method.
26857006aa82a69740df73415a456d31993e2785e24Hall Liu         */
26957006aa82a69740df73415a456d31993e2785e24Hall Liu        public void onRemoteRttRequest(RemoteConnection connection) {}
270bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton    }
271bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton
272295f5d7777ba63836bf75cb4de15bdaae06dfc1fTyler Gunn    /**
273295f5d7777ba63836bf75cb4de15bdaae06dfc1fTyler Gunn     * {@link RemoteConnection.VideoProvider} associated with a {@link RemoteConnection}.  Used to
274295f5d7777ba63836bf75cb4de15bdaae06dfc1fTyler Gunn     * receive video related events and control the video associated with a
275295f5d7777ba63836bf75cb4de15bdaae06dfc1fTyler Gunn     * {@link RemoteConnection}.
276295f5d7777ba63836bf75cb4de15bdaae06dfc1fTyler Gunn     *
277295f5d7777ba63836bf75cb4de15bdaae06dfc1fTyler Gunn     * @see Connection.VideoProvider
278295f5d7777ba63836bf75cb4de15bdaae06dfc1fTyler Gunn     */
279a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad    public static class VideoProvider {
280a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad
281295f5d7777ba63836bf75cb4de15bdaae06dfc1fTyler Gunn        /**
282295f5d7777ba63836bf75cb4de15bdaae06dfc1fTyler Gunn         * Callback class used by the {@link RemoteConnection.VideoProvider} to relay events from
283295f5d7777ba63836bf75cb4de15bdaae06dfc1fTyler Gunn         * the {@link Connection.VideoProvider}.
284295f5d7777ba63836bf75cb4de15bdaae06dfc1fTyler Gunn         */
285a2df92512b79e55a3b7c118eeb9ae60628f43c7aTyler Gunn        public abstract static class Callback {
286295f5d7777ba63836bf75cb4de15bdaae06dfc1fTyler Gunn            /**
287295f5d7777ba63836bf75cb4de15bdaae06dfc1fTyler Gunn             * Reports a session modification request received from the
288295f5d7777ba63836bf75cb4de15bdaae06dfc1fTyler Gunn             * {@link Connection.VideoProvider} associated with a {@link RemoteConnection}.
289295f5d7777ba63836bf75cb4de15bdaae06dfc1fTyler Gunn             *
290295f5d7777ba63836bf75cb4de15bdaae06dfc1fTyler Gunn             * @param videoProvider The {@link RemoteConnection.VideoProvider} invoking this method.
291295f5d7777ba63836bf75cb4de15bdaae06dfc1fTyler Gunn             * @param videoProfile The requested video call profile.
292295f5d7777ba63836bf75cb4de15bdaae06dfc1fTyler Gunn             * @see InCallService.VideoCall.Callback#onSessionModifyRequestReceived(VideoProfile)
293295f5d7777ba63836bf75cb4de15bdaae06dfc1fTyler Gunn             * @see Connection.VideoProvider#receiveSessionModifyRequest(VideoProfile)
294295f5d7777ba63836bf75cb4de15bdaae06dfc1fTyler Gunn             */
295a2df92512b79e55a3b7c118eeb9ae60628f43c7aTyler Gunn            public void onSessionModifyRequestReceived(
296a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad                    VideoProvider videoProvider,
297a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad                    VideoProfile videoProfile) {}
298a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad
299295f5d7777ba63836bf75cb4de15bdaae06dfc1fTyler Gunn            /**
300295f5d7777ba63836bf75cb4de15bdaae06dfc1fTyler Gunn             * Reports a session modification response received from the
301295f5d7777ba63836bf75cb4de15bdaae06dfc1fTyler Gunn             * {@link Connection.VideoProvider} associated with a {@link RemoteConnection}.
302295f5d7777ba63836bf75cb4de15bdaae06dfc1fTyler Gunn             *
303295f5d7777ba63836bf75cb4de15bdaae06dfc1fTyler Gunn             * @param videoProvider The {@link RemoteConnection.VideoProvider} invoking this method.
304295f5d7777ba63836bf75cb4de15bdaae06dfc1fTyler Gunn             * @param status Status of the session modify request.
305295f5d7777ba63836bf75cb4de15bdaae06dfc1fTyler Gunn             * @param requestedProfile The original request which was sent to the peer device.
306295f5d7777ba63836bf75cb4de15bdaae06dfc1fTyler Gunn             * @param responseProfile The actual profile changes made by the peer device.
307295f5d7777ba63836bf75cb4de15bdaae06dfc1fTyler Gunn             * @see InCallService.VideoCall.Callback#onSessionModifyResponseReceived(int,
308295f5d7777ba63836bf75cb4de15bdaae06dfc1fTyler Gunn             *      VideoProfile, VideoProfile)
309295f5d7777ba63836bf75cb4de15bdaae06dfc1fTyler Gunn             * @see Connection.VideoProvider#receiveSessionModifyResponse(int, VideoProfile,
310295f5d7777ba63836bf75cb4de15bdaae06dfc1fTyler Gunn             *      VideoProfile)
311295f5d7777ba63836bf75cb4de15bdaae06dfc1fTyler Gunn             */
312a2df92512b79e55a3b7c118eeb9ae60628f43c7aTyler Gunn            public void onSessionModifyResponseReceived(
313a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad                    VideoProvider videoProvider,
314a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad                    int status,
315a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad                    VideoProfile requestedProfile,
316a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad                    VideoProfile responseProfile) {}
317a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad
318295f5d7777ba63836bf75cb4de15bdaae06dfc1fTyler Gunn            /**
319295f5d7777ba63836bf75cb4de15bdaae06dfc1fTyler Gunn             * Reports a call session event received from the {@link Connection.VideoProvider}
320295f5d7777ba63836bf75cb4de15bdaae06dfc1fTyler Gunn             * associated with a {@link RemoteConnection}.
321295f5d7777ba63836bf75cb4de15bdaae06dfc1fTyler Gunn             *
322295f5d7777ba63836bf75cb4de15bdaae06dfc1fTyler Gunn             * @param videoProvider The {@link RemoteConnection.VideoProvider} invoking this method.
323295f5d7777ba63836bf75cb4de15bdaae06dfc1fTyler Gunn             * @param event The event.
324295f5d7777ba63836bf75cb4de15bdaae06dfc1fTyler Gunn             * @see InCallService.VideoCall.Callback#onCallSessionEvent(int)
325295f5d7777ba63836bf75cb4de15bdaae06dfc1fTyler Gunn             * @see Connection.VideoProvider#handleCallSessionEvent(int)
326295f5d7777ba63836bf75cb4de15bdaae06dfc1fTyler Gunn             */
327a2df92512b79e55a3b7c118eeb9ae60628f43c7aTyler Gunn            public void onCallSessionEvent(VideoProvider videoProvider, int event) {}
328a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad
329295f5d7777ba63836bf75cb4de15bdaae06dfc1fTyler Gunn            /**
330295f5d7777ba63836bf75cb4de15bdaae06dfc1fTyler Gunn             * Reports a change in the peer video dimensions received from the
331295f5d7777ba63836bf75cb4de15bdaae06dfc1fTyler Gunn             * {@link Connection.VideoProvider} associated with a {@link RemoteConnection}.
332295f5d7777ba63836bf75cb4de15bdaae06dfc1fTyler Gunn             *
333295f5d7777ba63836bf75cb4de15bdaae06dfc1fTyler Gunn             * @param videoProvider The {@link RemoteConnection.VideoProvider} invoking this method.
334295f5d7777ba63836bf75cb4de15bdaae06dfc1fTyler Gunn             * @param width  The updated peer video width.
335295f5d7777ba63836bf75cb4de15bdaae06dfc1fTyler Gunn             * @param height The updated peer video height.
336295f5d7777ba63836bf75cb4de15bdaae06dfc1fTyler Gunn             * @see InCallService.VideoCall.Callback#onPeerDimensionsChanged(int, int)
337295f5d7777ba63836bf75cb4de15bdaae06dfc1fTyler Gunn             * @see Connection.VideoProvider#changePeerDimensions(int, int)
338295f5d7777ba63836bf75cb4de15bdaae06dfc1fTyler Gunn             */
339295f5d7777ba63836bf75cb4de15bdaae06dfc1fTyler Gunn            public void onPeerDimensionsChanged(VideoProvider videoProvider, int width,
340295f5d7777ba63836bf75cb4de15bdaae06dfc1fTyler Gunn                    int height) {}
341295f5d7777ba63836bf75cb4de15bdaae06dfc1fTyler Gunn
342295f5d7777ba63836bf75cb4de15bdaae06dfc1fTyler Gunn            /**
343295f5d7777ba63836bf75cb4de15bdaae06dfc1fTyler Gunn             * Reports a change in the data usage (in bytes) received from the
344295f5d7777ba63836bf75cb4de15bdaae06dfc1fTyler Gunn             * {@link Connection.VideoProvider} associated with a {@link RemoteConnection}.
345295f5d7777ba63836bf75cb4de15bdaae06dfc1fTyler Gunn             *
346295f5d7777ba63836bf75cb4de15bdaae06dfc1fTyler Gunn             * @param videoProvider The {@link RemoteConnection.VideoProvider} invoking this method.
347295f5d7777ba63836bf75cb4de15bdaae06dfc1fTyler Gunn             * @param dataUsage The updated data usage (in bytes).
348295f5d7777ba63836bf75cb4de15bdaae06dfc1fTyler Gunn             * @see InCallService.VideoCall.Callback#onCallDataUsageChanged(long)
349295f5d7777ba63836bf75cb4de15bdaae06dfc1fTyler Gunn             * @see Connection.VideoProvider#setCallDataUsage(long)
350295f5d7777ba63836bf75cb4de15bdaae06dfc1fTyler Gunn             */
35107366813cdf3768dcd69a1f744023747564d654aRekha Kumar            public void onCallDataUsageChanged(VideoProvider videoProvider, long dataUsage) {}
352a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad
353295f5d7777ba63836bf75cb4de15bdaae06dfc1fTyler Gunn            /**
354295f5d7777ba63836bf75cb4de15bdaae06dfc1fTyler Gunn             * Reports a change in the capabilities of the current camera, received from the
355295f5d7777ba63836bf75cb4de15bdaae06dfc1fTyler Gunn             * {@link Connection.VideoProvider} associated with a {@link RemoteConnection}.
356295f5d7777ba63836bf75cb4de15bdaae06dfc1fTyler Gunn             *
357295f5d7777ba63836bf75cb4de15bdaae06dfc1fTyler Gunn             * @param videoProvider The {@link RemoteConnection.VideoProvider} invoking this method.
358295f5d7777ba63836bf75cb4de15bdaae06dfc1fTyler Gunn             * @param cameraCapabilities The changed camera capabilities.
359295f5d7777ba63836bf75cb4de15bdaae06dfc1fTyler Gunn             * @see InCallService.VideoCall.Callback#onCameraCapabilitiesChanged(
360295f5d7777ba63836bf75cb4de15bdaae06dfc1fTyler Gunn             *      VideoProfile.CameraCapabilities)
361295f5d7777ba63836bf75cb4de15bdaae06dfc1fTyler Gunn             * @see Connection.VideoProvider#changeCameraCapabilities(
362295f5d7777ba63836bf75cb4de15bdaae06dfc1fTyler Gunn             *      VideoProfile.CameraCapabilities)
363295f5d7777ba63836bf75cb4de15bdaae06dfc1fTyler Gunn             */
364a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad            public void onCameraCapabilitiesChanged(
365a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad                    VideoProvider videoProvider,
366400470fab932fe3374149ab89386e460ea161002Yorke Lee                    VideoProfile.CameraCapabilities cameraCapabilities) {}
36707366813cdf3768dcd69a1f744023747564d654aRekha Kumar
368295f5d7777ba63836bf75cb4de15bdaae06dfc1fTyler Gunn            /**
369295f5d7777ba63836bf75cb4de15bdaae06dfc1fTyler Gunn             * Reports a change in the video quality received from the
370295f5d7777ba63836bf75cb4de15bdaae06dfc1fTyler Gunn             * {@link Connection.VideoProvider} associated with a {@link RemoteConnection}.
371295f5d7777ba63836bf75cb4de15bdaae06dfc1fTyler Gunn             *
372295f5d7777ba63836bf75cb4de15bdaae06dfc1fTyler Gunn             * @param videoProvider The {@link RemoteConnection.VideoProvider} invoking this method.
373295f5d7777ba63836bf75cb4de15bdaae06dfc1fTyler Gunn             * @param videoQuality  The updated peer video quality.
374295f5d7777ba63836bf75cb4de15bdaae06dfc1fTyler Gunn             * @see InCallService.VideoCall.Callback#onVideoQualityChanged(int)
375295f5d7777ba63836bf75cb4de15bdaae06dfc1fTyler Gunn             * @see Connection.VideoProvider#changeVideoQuality(int)
376295f5d7777ba63836bf75cb4de15bdaae06dfc1fTyler Gunn             */
37707366813cdf3768dcd69a1f744023747564d654aRekha Kumar            public void onVideoQualityChanged(VideoProvider videoProvider, int videoQuality) {}
378a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad        }
379a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad
380a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad        private final IVideoCallback mVideoCallbackDelegate = new IVideoCallback() {
381a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad            @Override
382a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad            public void receiveSessionModifyRequest(VideoProfile videoProfile) {
383a2df92512b79e55a3b7c118eeb9ae60628f43c7aTyler Gunn                for (Callback l : mCallbacks) {
384a2df92512b79e55a3b7c118eeb9ae60628f43c7aTyler Gunn                    l.onSessionModifyRequestReceived(VideoProvider.this, videoProfile);
385a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad                }
386a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad            }
387a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad
388a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad            @Override
389a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad            public void receiveSessionModifyResponse(int status, VideoProfile requestedProfile,
390a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad                    VideoProfile responseProfile) {
391a2df92512b79e55a3b7c118eeb9ae60628f43c7aTyler Gunn                for (Callback l : mCallbacks) {
392a2df92512b79e55a3b7c118eeb9ae60628f43c7aTyler Gunn                    l.onSessionModifyResponseReceived(
393a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad                            VideoProvider.this,
394a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad                            status,
395a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad                            requestedProfile,
396a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad                            responseProfile);
397a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad                }
398a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad            }
399a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad
400a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad            @Override
401a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad            public void handleCallSessionEvent(int event) {
402a2df92512b79e55a3b7c118eeb9ae60628f43c7aTyler Gunn                for (Callback l : mCallbacks) {
403a2df92512b79e55a3b7c118eeb9ae60628f43c7aTyler Gunn                    l.onCallSessionEvent(VideoProvider.this, event);
404a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad                }
405a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad            }
406a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad
407a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad            @Override
408a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad            public void changePeerDimensions(int width, int height) {
409a2df92512b79e55a3b7c118eeb9ae60628f43c7aTyler Gunn                for (Callback l : mCallbacks) {
410a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad                    l.onPeerDimensionsChanged(VideoProvider.this, width, height);
411a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad                }
412a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad            }
413a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad
414a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad            @Override
41507366813cdf3768dcd69a1f744023747564d654aRekha Kumar            public void changeCallDataUsage(long dataUsage) {
416a2df92512b79e55a3b7c118eeb9ae60628f43c7aTyler Gunn                for (Callback l : mCallbacks) {
417a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad                    l.onCallDataUsageChanged(VideoProvider.this, dataUsage);
418a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad                }
419a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad            }
420a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad
421a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad            @Override
422400470fab932fe3374149ab89386e460ea161002Yorke Lee            public void changeCameraCapabilities(
423400470fab932fe3374149ab89386e460ea161002Yorke Lee                    VideoProfile.CameraCapabilities cameraCapabilities) {
424a2df92512b79e55a3b7c118eeb9ae60628f43c7aTyler Gunn                for (Callback l : mCallbacks) {
425a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad                    l.onCameraCapabilitiesChanged(VideoProvider.this, cameraCapabilities);
426a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad                }
427a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad            }
428a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad
429a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad            @Override
43007366813cdf3768dcd69a1f744023747564d654aRekha Kumar            public void changeVideoQuality(int videoQuality) {
431a2df92512b79e55a3b7c118eeb9ae60628f43c7aTyler Gunn                for (Callback l : mCallbacks) {
43207366813cdf3768dcd69a1f744023747564d654aRekha Kumar                    l.onVideoQualityChanged(VideoProvider.this, videoQuality);
43307366813cdf3768dcd69a1f744023747564d654aRekha Kumar                }
43407366813cdf3768dcd69a1f744023747564d654aRekha Kumar            }
43507366813cdf3768dcd69a1f744023747564d654aRekha Kumar
43607366813cdf3768dcd69a1f744023747564d654aRekha Kumar            @Override
437a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad            public IBinder asBinder() {
438a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad                return null;
439a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad            }
440a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad        };
441a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad
442a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad        private final VideoCallbackServant mVideoCallbackServant =
443a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad                new VideoCallbackServant(mVideoCallbackDelegate);
444a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad
445a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad        private final IVideoProvider mVideoProviderBinder;
446a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad
447b88b311463704af6254ac6a2b4f8c484eaaa7a77Tyler Gunn        private final String mCallingPackage;
448b88b311463704af6254ac6a2b4f8c484eaaa7a77Tyler Gunn
449159f35c8e4a2d5902cbbeb8d3b9a80bddf247de3Tyler Gunn        private final int mTargetSdkVersion;
450159f35c8e4a2d5902cbbeb8d3b9a80bddf247de3Tyler Gunn
451a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad        /**
452a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad         * ConcurrentHashMap constructor params: 8 is initial table size, 0.9f is
453a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad         * load factor before resizing, 1 means we only expect a single thread to
454a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad         * access the map so make only a single shard
455a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad         */
456a2df92512b79e55a3b7c118eeb9ae60628f43c7aTyler Gunn        private final Set<Callback> mCallbacks = Collections.newSetFromMap(
457a2df92512b79e55a3b7c118eeb9ae60628f43c7aTyler Gunn                new ConcurrentHashMap<Callback, Boolean>(8, 0.9f, 1));
458a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad
459159f35c8e4a2d5902cbbeb8d3b9a80bddf247de3Tyler Gunn        VideoProvider(IVideoProvider videoProviderBinder, String callingPackage,
460159f35c8e4a2d5902cbbeb8d3b9a80bddf247de3Tyler Gunn                      int targetSdkVersion) {
461159f35c8e4a2d5902cbbeb8d3b9a80bddf247de3Tyler Gunn
462a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad            mVideoProviderBinder = videoProviderBinder;
463b88b311463704af6254ac6a2b4f8c484eaaa7a77Tyler Gunn            mCallingPackage = callingPackage;
464159f35c8e4a2d5902cbbeb8d3b9a80bddf247de3Tyler Gunn            mTargetSdkVersion = targetSdkVersion;
465a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad            try {
46675958420f2d294ceda517c2782b294002dc2969fTyler Gunn                mVideoProviderBinder.addVideoCallback(mVideoCallbackServant.getStub().asBinder());
467a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad            } catch (RemoteException e) {
468a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad            }
469a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad        }
470a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad
471295f5d7777ba63836bf75cb4de15bdaae06dfc1fTyler Gunn        /**
472295f5d7777ba63836bf75cb4de15bdaae06dfc1fTyler Gunn         * Registers a callback to receive commands and state changes for video calls.
473295f5d7777ba63836bf75cb4de15bdaae06dfc1fTyler Gunn         *
474295f5d7777ba63836bf75cb4de15bdaae06dfc1fTyler Gunn         * @param l The video call callback.
475295f5d7777ba63836bf75cb4de15bdaae06dfc1fTyler Gunn         */
476a2df92512b79e55a3b7c118eeb9ae60628f43c7aTyler Gunn        public void registerCallback(Callback l) {
477a2df92512b79e55a3b7c118eeb9ae60628f43c7aTyler Gunn            mCallbacks.add(l);
478a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad        }
479a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad
480295f5d7777ba63836bf75cb4de15bdaae06dfc1fTyler Gunn        /**
481295f5d7777ba63836bf75cb4de15bdaae06dfc1fTyler Gunn         * Clears the video call callback set via {@link #registerCallback}.
482295f5d7777ba63836bf75cb4de15bdaae06dfc1fTyler Gunn         *
483295f5d7777ba63836bf75cb4de15bdaae06dfc1fTyler Gunn         * @param l The video call callback to clear.
484295f5d7777ba63836bf75cb4de15bdaae06dfc1fTyler Gunn         */
485a2df92512b79e55a3b7c118eeb9ae60628f43c7aTyler Gunn        public void unregisterCallback(Callback l) {
486a2df92512b79e55a3b7c118eeb9ae60628f43c7aTyler Gunn            mCallbacks.remove(l);
487a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad        }
488a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad
489295f5d7777ba63836bf75cb4de15bdaae06dfc1fTyler Gunn        /**
490295f5d7777ba63836bf75cb4de15bdaae06dfc1fTyler Gunn         * Sets the camera to be used for the outgoing video for the
491295f5d7777ba63836bf75cb4de15bdaae06dfc1fTyler Gunn         * {@link RemoteConnection.VideoProvider}.
492295f5d7777ba63836bf75cb4de15bdaae06dfc1fTyler Gunn         *
493295f5d7777ba63836bf75cb4de15bdaae06dfc1fTyler Gunn         * @param cameraId The id of the camera (use ids as reported by
494295f5d7777ba63836bf75cb4de15bdaae06dfc1fTyler Gunn         * {@link CameraManager#getCameraIdList()}).
495295f5d7777ba63836bf75cb4de15bdaae06dfc1fTyler Gunn         * @see Connection.VideoProvider#onSetCamera(String)
496295f5d7777ba63836bf75cb4de15bdaae06dfc1fTyler Gunn         */
497a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad        public void setCamera(String cameraId) {
498a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad            try {
499159f35c8e4a2d5902cbbeb8d3b9a80bddf247de3Tyler Gunn                mVideoProviderBinder.setCamera(cameraId, mCallingPackage, mTargetSdkVersion);
500a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad            } catch (RemoteException e) {
501a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad            }
502a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad        }
503a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad
504295f5d7777ba63836bf75cb4de15bdaae06dfc1fTyler Gunn        /**
505295f5d7777ba63836bf75cb4de15bdaae06dfc1fTyler Gunn         * Sets the surface to be used for displaying a preview of what the user's camera is
506295f5d7777ba63836bf75cb4de15bdaae06dfc1fTyler Gunn         * currently capturing for the {@link RemoteConnection.VideoProvider}.
507295f5d7777ba63836bf75cb4de15bdaae06dfc1fTyler Gunn         *
508295f5d7777ba63836bf75cb4de15bdaae06dfc1fTyler Gunn         * @param surface The {@link Surface}.
509295f5d7777ba63836bf75cb4de15bdaae06dfc1fTyler Gunn         * @see Connection.VideoProvider#onSetPreviewSurface(Surface)
510295f5d7777ba63836bf75cb4de15bdaae06dfc1fTyler Gunn         */
511a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad        public void setPreviewSurface(Surface surface) {
512a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad            try {
513a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad                mVideoProviderBinder.setPreviewSurface(surface);
514a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad            } catch (RemoteException e) {
515a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad            }
516a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad        }
517a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad
518295f5d7777ba63836bf75cb4de15bdaae06dfc1fTyler Gunn        /**
519295f5d7777ba63836bf75cb4de15bdaae06dfc1fTyler Gunn         * Sets the surface to be used for displaying the video received from the remote device for
520295f5d7777ba63836bf75cb4de15bdaae06dfc1fTyler Gunn         * the {@link RemoteConnection.VideoProvider}.
521295f5d7777ba63836bf75cb4de15bdaae06dfc1fTyler Gunn         *
522295f5d7777ba63836bf75cb4de15bdaae06dfc1fTyler Gunn         * @param surface The {@link Surface}.
523295f5d7777ba63836bf75cb4de15bdaae06dfc1fTyler Gunn         * @see Connection.VideoProvider#onSetDisplaySurface(Surface)
524295f5d7777ba63836bf75cb4de15bdaae06dfc1fTyler Gunn         */
525a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad        public void setDisplaySurface(Surface surface) {
526a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad            try {
527a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad                mVideoProviderBinder.setDisplaySurface(surface);
528a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad            } catch (RemoteException e) {
529a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad            }
530a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad        }
531a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad
532295f5d7777ba63836bf75cb4de15bdaae06dfc1fTyler Gunn        /**
533295f5d7777ba63836bf75cb4de15bdaae06dfc1fTyler Gunn         * Sets the device orientation, in degrees, for the {@link RemoteConnection.VideoProvider}.
534295f5d7777ba63836bf75cb4de15bdaae06dfc1fTyler Gunn         * Assumes that a standard portrait orientation of the device is 0 degrees.
535295f5d7777ba63836bf75cb4de15bdaae06dfc1fTyler Gunn         *
536295f5d7777ba63836bf75cb4de15bdaae06dfc1fTyler Gunn         * @param rotation The device orientation, in degrees.
537295f5d7777ba63836bf75cb4de15bdaae06dfc1fTyler Gunn         * @see Connection.VideoProvider#onSetDeviceOrientation(int)
538295f5d7777ba63836bf75cb4de15bdaae06dfc1fTyler Gunn         */
539a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad        public void setDeviceOrientation(int rotation) {
540a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad            try {
541a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad                mVideoProviderBinder.setDeviceOrientation(rotation);
542a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad            } catch (RemoteException e) {
543a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad            }
544a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad        }
545a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad
546295f5d7777ba63836bf75cb4de15bdaae06dfc1fTyler Gunn        /**
547295f5d7777ba63836bf75cb4de15bdaae06dfc1fTyler Gunn         * Sets camera zoom ratio for the {@link RemoteConnection.VideoProvider}.
548295f5d7777ba63836bf75cb4de15bdaae06dfc1fTyler Gunn         *
549295f5d7777ba63836bf75cb4de15bdaae06dfc1fTyler Gunn         * @param value The camera zoom ratio.
550295f5d7777ba63836bf75cb4de15bdaae06dfc1fTyler Gunn         * @see Connection.VideoProvider#onSetZoom(float)
551295f5d7777ba63836bf75cb4de15bdaae06dfc1fTyler Gunn         */
552a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad        public void setZoom(float value) {
553a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad            try {
554a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad                mVideoProviderBinder.setZoom(value);
555a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad            } catch (RemoteException e) {
556a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad            }
557a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad        }
558a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad
559295f5d7777ba63836bf75cb4de15bdaae06dfc1fTyler Gunn        /**
560295f5d7777ba63836bf75cb4de15bdaae06dfc1fTyler Gunn         * Issues a request to modify the properties of the current video session for the
561295f5d7777ba63836bf75cb4de15bdaae06dfc1fTyler Gunn         * {@link RemoteConnection.VideoProvider}.
562295f5d7777ba63836bf75cb4de15bdaae06dfc1fTyler Gunn         *
563295f5d7777ba63836bf75cb4de15bdaae06dfc1fTyler Gunn         * @param fromProfile The video profile prior to the request.
564295f5d7777ba63836bf75cb4de15bdaae06dfc1fTyler Gunn         * @param toProfile The video profile with the requested changes made.
565295f5d7777ba63836bf75cb4de15bdaae06dfc1fTyler Gunn         * @see Connection.VideoProvider#onSendSessionModifyRequest(VideoProfile, VideoProfile)
566295f5d7777ba63836bf75cb4de15bdaae06dfc1fTyler Gunn         */
5674538216a31d15b01e18c7b504e51031da0ce6e40Tyler Gunn        public void sendSessionModifyRequest(VideoProfile fromProfile, VideoProfile toProfile) {
568a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad            try {
5694538216a31d15b01e18c7b504e51031da0ce6e40Tyler Gunn                mVideoProviderBinder.sendSessionModifyRequest(fromProfile, toProfile);
570a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad            } catch (RemoteException e) {
571a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad            }
572a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad        }
573a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad
574295f5d7777ba63836bf75cb4de15bdaae06dfc1fTyler Gunn        /**
575295f5d7777ba63836bf75cb4de15bdaae06dfc1fTyler Gunn         * Provides a response to a request to change the current call video session
576295f5d7777ba63836bf75cb4de15bdaae06dfc1fTyler Gunn         * properties for the {@link RemoteConnection.VideoProvider}.
577295f5d7777ba63836bf75cb4de15bdaae06dfc1fTyler Gunn         *
578295f5d7777ba63836bf75cb4de15bdaae06dfc1fTyler Gunn         * @param responseProfile The response call video properties.
579295f5d7777ba63836bf75cb4de15bdaae06dfc1fTyler Gunn         * @see Connection.VideoProvider#onSendSessionModifyResponse(VideoProfile)
580295f5d7777ba63836bf75cb4de15bdaae06dfc1fTyler Gunn         */
581a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad        public void sendSessionModifyResponse(VideoProfile responseProfile) {
582a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad            try {
583a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad                mVideoProviderBinder.sendSessionModifyResponse(responseProfile);
584a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad            } catch (RemoteException e) {
585a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad            }
586a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad        }
587a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad
588295f5d7777ba63836bf75cb4de15bdaae06dfc1fTyler Gunn        /**
589295f5d7777ba63836bf75cb4de15bdaae06dfc1fTyler Gunn         * Issues a request to retrieve the capabilities of the current camera for the
590295f5d7777ba63836bf75cb4de15bdaae06dfc1fTyler Gunn         * {@link RemoteConnection.VideoProvider}.
591295f5d7777ba63836bf75cb4de15bdaae06dfc1fTyler Gunn         *
592295f5d7777ba63836bf75cb4de15bdaae06dfc1fTyler Gunn         * @see Connection.VideoProvider#onRequestCameraCapabilities()
593295f5d7777ba63836bf75cb4de15bdaae06dfc1fTyler Gunn         */
594a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad        public void requestCameraCapabilities() {
595a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad            try {
596a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad                mVideoProviderBinder.requestCameraCapabilities();
597a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad            } catch (RemoteException e) {
598a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad            }
599a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad        }
600a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad
601295f5d7777ba63836bf75cb4de15bdaae06dfc1fTyler Gunn        /**
602295f5d7777ba63836bf75cb4de15bdaae06dfc1fTyler Gunn         * Issues a request to retrieve the data usage (in bytes) of the video portion of the
603295f5d7777ba63836bf75cb4de15bdaae06dfc1fTyler Gunn         * {@link RemoteConnection} for the {@link RemoteConnection.VideoProvider}.
604295f5d7777ba63836bf75cb4de15bdaae06dfc1fTyler Gunn         *
605295f5d7777ba63836bf75cb4de15bdaae06dfc1fTyler Gunn         * @see Connection.VideoProvider#onRequestConnectionDataUsage()
606295f5d7777ba63836bf75cb4de15bdaae06dfc1fTyler Gunn         */
607a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad        public void requestCallDataUsage() {
608a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad            try {
609a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad                mVideoProviderBinder.requestCallDataUsage();
610a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad            } catch (RemoteException e) {
611a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad            }
612a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad        }
613a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad
614295f5d7777ba63836bf75cb4de15bdaae06dfc1fTyler Gunn        /**
615295f5d7777ba63836bf75cb4de15bdaae06dfc1fTyler Gunn         * Sets the {@link Uri} of an image to be displayed to the peer device when the video signal
616295f5d7777ba63836bf75cb4de15bdaae06dfc1fTyler Gunn         * is paused, for the {@link RemoteConnection.VideoProvider}.
617295f5d7777ba63836bf75cb4de15bdaae06dfc1fTyler Gunn         *
618295f5d7777ba63836bf75cb4de15bdaae06dfc1fTyler Gunn         * @see Connection.VideoProvider#onSetPauseImage(Uri)
619295f5d7777ba63836bf75cb4de15bdaae06dfc1fTyler Gunn         */
62032f24731604fd81289a39619bbc925b65184b505Yorke Lee        public void setPauseImage(Uri uri) {
621a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad            try {
622a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad                mVideoProviderBinder.setPauseImage(uri);
623a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad            } catch (RemoteException e) {
624a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad            }
625a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad        }
626a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad    }
627a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad
628bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton    private IConnectionService mConnectionService;
62952d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon    private final String mConnectionId;
630229e3820dce98f64fd4834d5f421faec9a9d7026Jay Shrauner    /**
631229e3820dce98f64fd4834d5f421faec9a9d7026Jay Shrauner     * ConcurrentHashMap constructor params: 8 is initial table size, 0.9f is
632229e3820dce98f64fd4834d5f421faec9a9d7026Jay Shrauner     * load factor before resizing, 1 means we only expect a single thread to
633229e3820dce98f64fd4834d5f421faec9a9d7026Jay Shrauner     * access the map so make only a single shard
634229e3820dce98f64fd4834d5f421faec9a9d7026Jay Shrauner     */
635011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee    private final Set<CallbackRecord> mCallbackRecords = Collections.newSetFromMap(
636011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee            new ConcurrentHashMap<CallbackRecord, Boolean>(8, 0.9f, 1));
637b8e85c74e5910a461078704048d67f82b216508cIhab Awad    private final List<RemoteConnection> mConferenceableConnections = new ArrayList<>();
638b8e85c74e5910a461078704048d67f82b216508cIhab Awad    private final List<RemoteConnection> mUnmodifiableconferenceableConnections =
639b8e85c74e5910a461078704048d67f82b216508cIhab Awad            Collections.unmodifiableList(mConferenceableConnections);
64052d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon
641b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad    private int mState = Connection.STATE_NEW;
6427f3d41fd124dd7c4a8b72c1d48df08a8ee7209ecAndrew Lee    private DisconnectCause mDisconnectCause;
643100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee    private boolean mRingbackRequested;
64452d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon    private boolean mConnected;
6455c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad    private int mConnectionCapabilities;
646720c664401081ca00e56c7eef12641ae792da530Tyler Gunn    private int mConnectionProperties;
647aa07df84f279a87ad6370758c9d792a660f2cebbTyler Gunn    private int mVideoState;
648a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad    private VideoProvider mVideoProvider;
649100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee    private boolean mIsVoipAudioMode;
650e7ef59a77d55c9802cc7d919f7dd794bd5fea30eSailesh Nepal    private StatusHints mStatusHints;
651100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee    private Uri mAddress;
652100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee    private int mAddressPresentation;
653612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepal    private String mCallerDisplayName;
654612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepal    private int mCallerDisplayNamePresentation;
655b8e85c74e5910a461078704048d67f82b216508cIhab Awad    private RemoteConference mConference;
6566b7f955c2d9b231660b8c54f8ef8e8e6ad802625Santos Cordon    private Bundle mExtras;
65752d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon
65852d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon    /**
65952d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon     * @hide
66052d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon     */
661b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad    RemoteConnection(
662b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            String id,
663b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            IConnectionService connectionService,
664b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            ConnectionRequest request) {
665b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        mConnectionId = id;
6662a46b90222e5c9c73de012382a604a71f9c0c30cSailesh Nepal        mConnectionService = connectionService;
66752d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon        mConnected = true;
668b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        mState = Connection.STATE_INITIALIZING;
669bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton    }
670bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton
671bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton    /**
6724a57b9b59b74c97e559a301af0add13cd4c3331cTyler Gunn     * @hide
6734a57b9b59b74c97e559a301af0add13cd4c3331cTyler Gunn     */
6744a57b9b59b74c97e559a301af0add13cd4c3331cTyler Gunn    RemoteConnection(String callId, IConnectionService connectionService,
675159f35c8e4a2d5902cbbeb8d3b9a80bddf247de3Tyler Gunn            ParcelableConnection connection, String callingPackage, int targetSdkVersion) {
6764a57b9b59b74c97e559a301af0add13cd4c3331cTyler Gunn        mConnectionId = callId;
6774a57b9b59b74c97e559a301af0add13cd4c3331cTyler Gunn        mConnectionService = connectionService;
6784a57b9b59b74c97e559a301af0add13cd4c3331cTyler Gunn        mConnected = true;
6794a57b9b59b74c97e559a301af0add13cd4c3331cTyler Gunn        mState = connection.getState();
6804a57b9b59b74c97e559a301af0add13cd4c3331cTyler Gunn        mDisconnectCause = connection.getDisconnectCause();
6814a57b9b59b74c97e559a301af0add13cd4c3331cTyler Gunn        mRingbackRequested = connection.isRingbackRequested();
6825c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        mConnectionCapabilities = connection.getConnectionCapabilities();
683720c664401081ca00e56c7eef12641ae792da530Tyler Gunn        mConnectionProperties = connection.getConnectionProperties();
6844a57b9b59b74c97e559a301af0add13cd4c3331cTyler Gunn        mVideoState = connection.getVideoState();
6859c2c583ad7c01d756462e437e5c33b3b75f90e96Tyler Gunn        IVideoProvider videoProvider = connection.getVideoProvider();
6869c2c583ad7c01d756462e437e5c33b3b75f90e96Tyler Gunn        if (videoProvider != null) {
687159f35c8e4a2d5902cbbeb8d3b9a80bddf247de3Tyler Gunn            mVideoProvider = new RemoteConnection.VideoProvider(videoProvider, callingPackage,
688159f35c8e4a2d5902cbbeb8d3b9a80bddf247de3Tyler Gunn                    targetSdkVersion);
6899c2c583ad7c01d756462e437e5c33b3b75f90e96Tyler Gunn        } else {
6909c2c583ad7c01d756462e437e5c33b3b75f90e96Tyler Gunn            mVideoProvider = null;
6919c2c583ad7c01d756462e437e5c33b3b75f90e96Tyler Gunn        }
6924a57b9b59b74c97e559a301af0add13cd4c3331cTyler Gunn        mIsVoipAudioMode = connection.getIsVoipAudioMode();
6934a57b9b59b74c97e559a301af0add13cd4c3331cTyler Gunn        mStatusHints = connection.getStatusHints();
6944a57b9b59b74c97e559a301af0add13cd4c3331cTyler Gunn        mAddress = connection.getHandle();
6954a57b9b59b74c97e559a301af0add13cd4c3331cTyler Gunn        mAddressPresentation = connection.getHandlePresentation();
6964a57b9b59b74c97e559a301af0add13cd4c3331cTyler Gunn        mCallerDisplayName = connection.getCallerDisplayName();
6974a57b9b59b74c97e559a301af0add13cd4c3331cTyler Gunn        mCallerDisplayNamePresentation = connection.getCallerDisplayNamePresentation();
6984a57b9b59b74c97e559a301af0add13cd4c3331cTyler Gunn        mConference = null;
6992282bb97e78ea87ff322ecf12563ab0120af2b28Tyler Gunn        putExtras(connection.getExtras());
7002282bb97e78ea87ff322ecf12563ab0120af2b28Tyler Gunn
7012282bb97e78ea87ff322ecf12563ab0120af2b28Tyler Gunn        // Stash the original connection ID as it exists in the source ConnectionService.
7022282bb97e78ea87ff322ecf12563ab0120af2b28Tyler Gunn        // Telecom will use this to avoid adding duplicates later.
7032282bb97e78ea87ff322ecf12563ab0120af2b28Tyler Gunn        // See comments on Connection.EXTRA_ORIGINAL_CONNECTION_ID for more information.
7042282bb97e78ea87ff322ecf12563ab0120af2b28Tyler Gunn        Bundle newExtras = new Bundle();
7052282bb97e78ea87ff322ecf12563ab0120af2b28Tyler Gunn        newExtras.putString(Connection.EXTRA_ORIGINAL_CONNECTION_ID, callId);
7062282bb97e78ea87ff322ecf12563ab0120af2b28Tyler Gunn        putExtras(newExtras);
7074a57b9b59b74c97e559a301af0add13cd4c3331cTyler Gunn    }
7084a57b9b59b74c97e559a301af0add13cd4c3331cTyler Gunn
7094a57b9b59b74c97e559a301af0add13cd4c3331cTyler Gunn    /**
710bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton     * Create a RemoteConnection which is used for failed connections. Note that using it for any
711bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton     * "real" purpose will almost certainly fail. Callers should note the failure and act
712bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton     * accordingly (moving on to another RemoteConnection, for example)
713bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton     *
7147f3d41fd124dd7c4a8b72c1d48df08a8ee7209ecAndrew Lee     * @param disconnectCause The reason for the failed connection.
7157f3d41fd124dd7c4a8b72c1d48df08a8ee7209ecAndrew Lee     * @hide
716bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton     */
7177f3d41fd124dd7c4a8b72c1d48df08a8ee7209ecAndrew Lee    RemoteConnection(DisconnectCause disconnectCause) {
7184a57b9b59b74c97e559a301af0add13cd4c3331cTyler Gunn        mConnectionId = "NULL";
719bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton        mConnected = false;
7206107bab041fb7d851fbf865b7310d294aae970c8Ihab Awad        mState = Connection.STATE_DISCONNECTED;
7217f3d41fd124dd7c4a8b72c1d48df08a8ee7209ecAndrew Lee        mDisconnectCause = disconnectCause;
72252d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon    }
72352d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon
7245d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad    /**
725100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee     * Adds a callback to this {@code RemoteConnection}.
7265d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad     *
727100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee     * @param callback A {@code Callback}.
7285d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad     */
729100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee    public void registerCallback(Callback callback) {
730011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee        registerCallback(callback, new Handler());
731011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee    }
732011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee
733011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee    /**
734011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee     * Adds a callback to this {@code RemoteConnection}.
735011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee     *
736011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee     * @param callback A {@code Callback}.
737011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee     * @param handler A {@code Handler} which command and status changes will be delivered to.
738011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee     */
739011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee    public void registerCallback(Callback callback, Handler handler) {
740011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee        unregisterCallback(callback);
741011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee        if (callback != null && handler != null) {
742011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee            mCallbackRecords.add(new CallbackRecord(callback, handler));
743011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee        }
74452d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon    }
74552d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon
7465d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad    /**
747100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee     * Removes a callback from this {@code RemoteConnection}.
7485d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad     *
749100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee     * @param callback A {@code Callback}.
7505d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad     */
751100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee    public void unregisterCallback(Callback callback) {
752100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee        if (callback != null) {
753011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee            for (CallbackRecord record : mCallbackRecords) {
754011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee                if (record.getCallback() == callback) {
755011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee                    mCallbackRecords.remove(record);
756011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee                    break;
757011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee                }
758011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee            }
759229e3820dce98f64fd4834d5f421faec9a9d7026Jay Shrauner        }
76052d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon    }
76152d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon
7625d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad    /**
7635d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad     * Obtains the state of this {@code RemoteConnection}.
7645d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad     *
7655d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad     * @return A state value, chosen from the {@code STATE_*} constants.
7665d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad     */
767ade3f25a488fc3c1243db8c88554771e571beeb1Sailesh Nepal    public int getState() {
768ade3f25a488fc3c1243db8c88554771e571beeb1Sailesh Nepal        return mState;
769ade3f25a488fc3c1243db8c88554771e571beeb1Sailesh Nepal    }
770ade3f25a488fc3c1243db8c88554771e571beeb1Sailesh Nepal
7715d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad    /**
7725c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * Obtains the reason why this {@code RemoteConnection} may have been disconnected.
7735c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     *
774b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad     * @return For a {@link Connection#STATE_DISCONNECTED} {@code RemoteConnection}, the
7755c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     *         disconnect cause expressed as a code chosen from among those declared in
7765c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     *         {@link DisconnectCause}.
7775d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad     */
7787f3d41fd124dd7c4a8b72c1d48df08a8ee7209ecAndrew Lee    public DisconnectCause getDisconnectCause() {
7797f3d41fd124dd7c4a8b72c1d48df08a8ee7209ecAndrew Lee        return mDisconnectCause;
78052d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon    }
78152d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon
7825d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad    /**
7835c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * Obtains the capabilities of this {@code RemoteConnection}.
7845c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     *
7855d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad     * @return A bitmask of the capabilities of the {@code RemoteConnection}, as defined in
7865c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     *         the {@code CAPABILITY_*} constants in class {@link Connection}.
7875d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad     */
7885c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad    public int getConnectionCapabilities() {
7895c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        return mConnectionCapabilities;
7901a7061ba950538c93d92c0448752a212039cc06aSailesh Nepal    }
7911a7061ba950538c93d92c0448752a212039cc06aSailesh Nepal
7925d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad    /**
793720c664401081ca00e56c7eef12641ae792da530Tyler Gunn     * Obtains the properties of this {@code RemoteConnection}.
794720c664401081ca00e56c7eef12641ae792da530Tyler Gunn     *
795720c664401081ca00e56c7eef12641ae792da530Tyler Gunn     * @return A bitmask of the properties of the {@code RemoteConnection}, as defined in the
796720c664401081ca00e56c7eef12641ae792da530Tyler Gunn     *         {@code PROPERTY_*} constants in class {@link Connection}.
797720c664401081ca00e56c7eef12641ae792da530Tyler Gunn     */
798720c664401081ca00e56c7eef12641ae792da530Tyler Gunn    public int getConnectionProperties() {
799720c664401081ca00e56c7eef12641ae792da530Tyler Gunn        return mConnectionProperties;
800720c664401081ca00e56c7eef12641ae792da530Tyler Gunn    }
801720c664401081ca00e56c7eef12641ae792da530Tyler Gunn
802720c664401081ca00e56c7eef12641ae792da530Tyler Gunn    /**
8035c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * Determines if the audio mode of this {@code RemoteConnection} is VOIP.
8045c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     *
8055d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad     * @return {@code true} if the {@code RemoteConnection}'s current audio mode is VOIP.
8065d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad     */
807100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee    public boolean isVoipAudioMode() {
808100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee        return mIsVoipAudioMode;
80933aaae4a07fdcce223fe74d96d751f4bffa6723aSailesh Nepal    }
81033aaae4a07fdcce223fe74d96d751f4bffa6723aSailesh Nepal
8115d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad    /**
8125c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * Obtains status hints pertaining to this {@code RemoteConnection}.
8135c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     *
814b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad     * @return The current {@link StatusHints} of this {@code RemoteConnection},
8155c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     *         or {@code null} if none have been set.
8165d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad     */
817e7ef59a77d55c9802cc7d919f7dd794bd5fea30eSailesh Nepal    public StatusHints getStatusHints() {
818e7ef59a77d55c9802cc7d919f7dd794bd5fea30eSailesh Nepal        return mStatusHints;
819e7ef59a77d55c9802cc7d919f7dd794bd5fea30eSailesh Nepal    }
820e7ef59a77d55c9802cc7d919f7dd794bd5fea30eSailesh Nepal
8215d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad    /**
8225c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * Obtains the address of this {@code RemoteConnection}.
8235c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     *
8245c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * @return The address (e.g., phone number) to which the {@code RemoteConnection}
8255c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     *         is currently connected.
8265d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad     */
827100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee    public Uri getAddress() {
828100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee        return mAddress;
829612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepal    }
830612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepal
8315d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad    /**
8325c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * Obtains the presentation requirements for the address of this {@code RemoteConnection}.
8335c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     *
8345c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * @return The presentation requirements for the address. See
8355c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     *         {@link TelecomManager} for valid values.
8365d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad     */
837100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee    public int getAddressPresentation() {
838100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee        return mAddressPresentation;
839612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepal    }
840612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepal
8415d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad    /**
8425c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * Obtains the display name for this {@code RemoteConnection}'s caller.
8435c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     *
8445d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad     * @return The display name for the caller.
8455d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad     */
846100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee    public CharSequence getCallerDisplayName() {
847612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepal        return mCallerDisplayName;
848612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepal    }
849612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepal
8505d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad    /**
8515c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * Obtains the presentation requirements for this {@code RemoteConnection}'s
8525c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * caller's display name.
8535c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     *
8545d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad     * @return The presentation requirements for the caller display name. See
8555c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     *         {@link TelecomManager} for valid values.
8565d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad     */
857612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepal    public int getCallerDisplayNamePresentation() {
858612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepal        return mCallerDisplayNamePresentation;
859612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepal    }
860612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepal
8615d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad    /**
8625c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * Obtains the video state of this {@code RemoteConnection}.
8635c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     *
86487b73f370e2b8a76b0540580f43edba6ec21c6cfTyler Gunn     * @return The video state of the {@code RemoteConnection}. See {@link VideoProfile}.
8655d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad     */
866aa07df84f279a87ad6370758c9d792a660f2cebbTyler Gunn    public int getVideoState() {
867aa07df84f279a87ad6370758c9d792a660f2cebbTyler Gunn        return mVideoState;
868aa07df84f279a87ad6370758c9d792a660f2cebbTyler Gunn    }
869aa07df84f279a87ad6370758c9d792a660f2cebbTyler Gunn
8705d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad    /**
87107366813cdf3768dcd69a1f744023747564d654aRekha Kumar     * Obtains the video provider of this {@code RemoteConnection}.
872a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad     * @return The video provider associated with this {@code RemoteConnection}.
873a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad     */
874a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad    public final VideoProvider getVideoProvider() {
875a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad        return mVideoProvider;
876a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad    }
877a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad
878a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad    /**
8796b7f955c2d9b231660b8c54f8ef8e8e6ad802625Santos Cordon     * Obtain the extras associated with this {@code RemoteConnection}.
8806b7f955c2d9b231660b8c54f8ef8e8e6ad802625Santos Cordon     *
8816b7f955c2d9b231660b8c54f8ef8e8e6ad802625Santos Cordon     * @return The extras for this connection.
8826b7f955c2d9b231660b8c54f8ef8e8e6ad802625Santos Cordon     */
8836b7f955c2d9b231660b8c54f8ef8e8e6ad802625Santos Cordon    public final Bundle getExtras() {
8846b7f955c2d9b231660b8c54f8ef8e8e6ad802625Santos Cordon        return mExtras;
8856b7f955c2d9b231660b8c54f8ef8e8e6ad802625Santos Cordon    }
8866b7f955c2d9b231660b8c54f8ef8e8e6ad802625Santos Cordon
8876b7f955c2d9b231660b8c54f8ef8e8e6ad802625Santos Cordon    /**
8885c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * Determines whether this {@code RemoteConnection} is requesting ringback.
8895c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     *
8905d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad     * @return Whether the {@code RemoteConnection} is requesting that the framework play a
8915c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     *         ringback tone on its behalf.
8925d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad     */
893100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee    public boolean isRingbackRequested() {
89415d63c718f6e7bcec6c1fd47d2d06fd59b9c1aefSantos Cordon        return mRingbackRequested;
8955d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad    }
8965d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad
8975d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad    /**
8985d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad     * Instructs this {@code RemoteConnection} to abort.
8995d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad     */
900091768c3021d740b7d66846d36405c4d4c76cc56Sailesh Nepal    public void abort() {
901091768c3021d740b7d66846d36405c4d4c76cc56Sailesh Nepal        try {
902091768c3021d740b7d66846d36405c4d4c76cc56Sailesh Nepal            if (mConnected) {
903b32d4f8b5cd5b9c2415e291896b83267e1b4d5feBrad Ebinger                mConnectionService.abort(mConnectionId, null /*Session.Info*/);
904091768c3021d740b7d66846d36405c4d4c76cc56Sailesh Nepal            }
905091768c3021d740b7d66846d36405c4d4c76cc56Sailesh Nepal        } catch (RemoteException ignored) {
906091768c3021d740b7d66846d36405c4d4c76cc56Sailesh Nepal        }
907091768c3021d740b7d66846d36405c4d4c76cc56Sailesh Nepal    }
908091768c3021d740b7d66846d36405c4d4c76cc56Sailesh Nepal
9095d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad    /**
910b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad     * Instructs this {@link Connection#STATE_RINGING} {@code RemoteConnection} to answer.
911be74de0978a7eaa577f6b61902b550a3161aff8bTyler Gunn     */
912be74de0978a7eaa577f6b61902b550a3161aff8bTyler Gunn    public void answer() {
913be74de0978a7eaa577f6b61902b550a3161aff8bTyler Gunn        try {
914be74de0978a7eaa577f6b61902b550a3161aff8bTyler Gunn            if (mConnected) {
915b32d4f8b5cd5b9c2415e291896b83267e1b4d5feBrad Ebinger                mConnectionService.answer(mConnectionId, null /*Session.Info*/);
916be74de0978a7eaa577f6b61902b550a3161aff8bTyler Gunn            }
917be74de0978a7eaa577f6b61902b550a3161aff8bTyler Gunn        } catch (RemoteException ignored) {
918be74de0978a7eaa577f6b61902b550a3161aff8bTyler Gunn        }
919be74de0978a7eaa577f6b61902b550a3161aff8bTyler Gunn    }
920be74de0978a7eaa577f6b61902b550a3161aff8bTyler Gunn
921be74de0978a7eaa577f6b61902b550a3161aff8bTyler Gunn    /**
922be74de0978a7eaa577f6b61902b550a3161aff8bTyler Gunn     * Instructs this {@link Connection#STATE_RINGING} {@code RemoteConnection} to answer.
9235d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad     * @param videoState The video state in which to answer the call.
924be74de0978a7eaa577f6b61902b550a3161aff8bTyler Gunn     * @hide
9255d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad     */
9268da4c3c11faf066b2b04ba853f03be6f1c4af5d8Andrew Lee    public void answer(int videoState) {
92752d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon        try {
92852d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon            if (mConnected) {
929b32d4f8b5cd5b9c2415e291896b83267e1b4d5feBrad Ebinger                mConnectionService.answerVideo(mConnectionId, videoState, null /*Session.Info*/);
93052d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon            }
93152d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon        } catch (RemoteException ignored) {
93252d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon        }
93352d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon    }
93452d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon
9355d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad    /**
936b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad     * Instructs this {@link Connection#STATE_RINGING} {@code RemoteConnection} to reject.
9375d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad     */
93852d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon    public void reject() {
93952d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon        try {
94052d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon            if (mConnected) {
941b32d4f8b5cd5b9c2415e291896b83267e1b4d5feBrad Ebinger                mConnectionService.reject(mConnectionId, null /*Session.Info*/);
94252d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon            }
94352d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon        } catch (RemoteException ignored) {
94452d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon        }
94552d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon    }
94652d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon
9475d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad    /**
9485d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad     * Instructs this {@code RemoteConnection} to go on hold.
9495d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad     */
95052d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon    public void hold() {
95152d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon        try {
95252d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon            if (mConnected) {
953b32d4f8b5cd5b9c2415e291896b83267e1b4d5feBrad Ebinger                mConnectionService.hold(mConnectionId, null /*Session.Info*/);
95452d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon            }
95552d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon        } catch (RemoteException ignored) {
95652d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon        }
95752d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon    }
95852d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon
9595d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad    /**
960b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad     * Instructs this {@link Connection#STATE_HOLDING} call to release from hold.
9615d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad     */
96252d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon    public void unhold() {
96352d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon        try {
96452d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon            if (mConnected) {
965b32d4f8b5cd5b9c2415e291896b83267e1b4d5feBrad Ebinger                mConnectionService.unhold(mConnectionId, null /*Session.Info*/);
96652d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon            }
96752d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon        } catch (RemoteException ignored) {
96852d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon        }
96952d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon    }
97052d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon
9715d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad    /**
9725d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad     * Instructs this {@code RemoteConnection} to disconnect.
9735d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad     */
97452d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon    public void disconnect() {
97552d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon        try {
97652d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon            if (mConnected) {
977b32d4f8b5cd5b9c2415e291896b83267e1b4d5feBrad Ebinger                mConnectionService.disconnect(mConnectionId, null /*Session.Info*/);
97852d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon            }
97952d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon        } catch (RemoteException ignored) {
98052d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon        }
98152d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon    }
98252d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon
9835d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad    /**
9845d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad     * Instructs this {@code RemoteConnection} to play a dual-tone multi-frequency signaling
9855d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad     * (DTMF) tone.
9865d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad     *
9875d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad     * Any other currently playing DTMF tone in the specified call is immediately stopped.
9885d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad     *
9895d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad     * @param digit A character representing the DTMF digit for which to play the tone. This
9905d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad     *         value must be one of {@code '0'} through {@code '9'}, {@code '*'} or {@code '#'}.
9915d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad     */
9925d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad    public void playDtmfTone(char digit) {
99352d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon        try {
99452d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon            if (mConnected) {
995b32d4f8b5cd5b9c2415e291896b83267e1b4d5feBrad Ebinger                mConnectionService.playDtmfTone(mConnectionId, digit, null /*Session.Info*/);
99652d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon            }
99752d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon        } catch (RemoteException ignored) {
99852d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon        }
99952d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon    }
100052d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon
10015d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad    /**
10025d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad     * Instructs this {@code RemoteConnection} to stop any dual-tone multi-frequency signaling
10035d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad     * (DTMF) tone currently playing.
10045d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad     *
10055d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad     * DTMF tones are played by calling {@link #playDtmfTone(char)}. If no DTMF tone is
10065d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad     * currently playing, this method will do nothing.
10075d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad     */
10085d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad    public void stopDtmfTone() {
100952d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon        try {
101052d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon            if (mConnected) {
1011b32d4f8b5cd5b9c2415e291896b83267e1b4d5feBrad Ebinger                mConnectionService.stopDtmfTone(mConnectionId, null /*Session.Info*/);
101252d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon            }
101352d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon        } catch (RemoteException ignored) {
101452d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon        }
101552d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon    }
101652d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon
10175d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad    /**
10185d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad     * Instructs this {@code RemoteConnection} to continue playing a post-dial DTMF string.
10195d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad     *
10205d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad     * A post-dial DTMF string is a string of digits following the first instance of either
1021ef9f6f957d897ea0ed82114185b8fa3fefd4917bTyler Gunn     * {@link TelecomManager#DTMF_CHARACTER_WAIT} or {@link TelecomManager#DTMF_CHARACTER_PAUSE}.
10225d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad     * These digits are immediately sent as DTMF tones to the recipient as soon as the
10235d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad     * connection is made.
10245d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad     *
1025ef9f6f957d897ea0ed82114185b8fa3fefd4917bTyler Gunn     * If the DTMF string contains a {@link TelecomManager#DTMF_CHARACTER_PAUSE} symbol, this
10265d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad     * {@code RemoteConnection} will temporarily pause playing the tones for a pre-defined period
10275d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad     * of time.
10285d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad     *
1029ef9f6f957d897ea0ed82114185b8fa3fefd4917bTyler Gunn     * If the DTMF string contains a {@link TelecomManager#DTMF_CHARACTER_WAIT} symbol, this
103027d1c2d148fe377ca0d2744f0f85789a42c8f808Nancy Chen     * {@code RemoteConnection} will pause playing the tones and notify callbacks via
1031100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee     * {@link Callback#onPostDialWait(RemoteConnection, String)}. At this point, the in-call app
10325d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad     * should display to the user an indication of this state and an affordance to continue
10335d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad     * the postdial sequence. When the user decides to continue the postdial sequence, the in-call
10345d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad     * app should invoke the {@link #postDialContinue(boolean)} method.
10355d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad     *
10365d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad     * @param proceed Whether or not to continue with the post-dial sequence.
10375d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad     */
103852d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon    public void postDialContinue(boolean proceed) {
103952d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon        try {
104052d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon            if (mConnected) {
1041b32d4f8b5cd5b9c2415e291896b83267e1b4d5feBrad Ebinger                mConnectionService.onPostDialContinue(mConnectionId, proceed,
1042b32d4f8b5cd5b9c2415e291896b83267e1b4d5feBrad Ebinger                        null /*Session.Info*/);
104352d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon            }
104452d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon        } catch (RemoteException ignored) {
104552d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon        }
104652d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon    }
104752d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon
10485d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad    /**
1049876dbfb4767da4a2ba5459d5b78fb6eb55e4516fTyler Gunn     * Instructs this {@link RemoteConnection} to pull itself to the local device.
1050876dbfb4767da4a2ba5459d5b78fb6eb55e4516fTyler Gunn     * <p>
1051876dbfb4767da4a2ba5459d5b78fb6eb55e4516fTyler Gunn     * See {@link Call#pullExternalCall()} for more information.
1052876dbfb4767da4a2ba5459d5b78fb6eb55e4516fTyler Gunn     */
1053876dbfb4767da4a2ba5459d5b78fb6eb55e4516fTyler Gunn    public void pullExternalCall() {
1054876dbfb4767da4a2ba5459d5b78fb6eb55e4516fTyler Gunn        try {
1055876dbfb4767da4a2ba5459d5b78fb6eb55e4516fTyler Gunn            if (mConnected) {
1056b32d4f8b5cd5b9c2415e291896b83267e1b4d5feBrad Ebinger                mConnectionService.pullExternalCall(mConnectionId, null /*Session.Info*/);
1057876dbfb4767da4a2ba5459d5b78fb6eb55e4516fTyler Gunn            }
1058876dbfb4767da4a2ba5459d5b78fb6eb55e4516fTyler Gunn        } catch (RemoteException ignored) {
1059876dbfb4767da4a2ba5459d5b78fb6eb55e4516fTyler Gunn        }
1060876dbfb4767da4a2ba5459d5b78fb6eb55e4516fTyler Gunn    }
1061876dbfb4767da4a2ba5459d5b78fb6eb55e4516fTyler Gunn
1062876dbfb4767da4a2ba5459d5b78fb6eb55e4516fTyler Gunn    /**
10635d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad     * Set the audio state of this {@code RemoteConnection}.
10645d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad     *
10655d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad     * @param state The audio state of this {@code RemoteConnection}.
10664af5935c71f1e31ef1aec27661c4ef60545a0924Yorke Lee     * @hide
10674af5935c71f1e31ef1aec27661c4ef60545a0924Yorke Lee     * @deprecated Use {@link #setCallAudioState(CallAudioState) instead.
10685d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad     */
10694af5935c71f1e31ef1aec27661c4ef60545a0924Yorke Lee    @SystemApi
10704af5935c71f1e31ef1aec27661c4ef60545a0924Yorke Lee    @Deprecated
1071b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad    public void setAudioState(AudioState state) {
10724af5935c71f1e31ef1aec27661c4ef60545a0924Yorke Lee        setCallAudioState(new CallAudioState(state));
10734af5935c71f1e31ef1aec27661c4ef60545a0924Yorke Lee    }
10744af5935c71f1e31ef1aec27661c4ef60545a0924Yorke Lee
10754af5935c71f1e31ef1aec27661c4ef60545a0924Yorke Lee    /**
10764af5935c71f1e31ef1aec27661c4ef60545a0924Yorke Lee     * Set the audio state of this {@code RemoteConnection}.
10774af5935c71f1e31ef1aec27661c4ef60545a0924Yorke Lee     *
10784af5935c71f1e31ef1aec27661c4ef60545a0924Yorke Lee     * @param state The audio state of this {@code RemoteConnection}.
10794af5935c71f1e31ef1aec27661c4ef60545a0924Yorke Lee     */
10804af5935c71f1e31ef1aec27661c4ef60545a0924Yorke Lee    public void setCallAudioState(CallAudioState state) {
1081091768c3021d740b7d66846d36405c4d4c76cc56Sailesh Nepal        try {
1082091768c3021d740b7d66846d36405c4d4c76cc56Sailesh Nepal            if (mConnected) {
1083b32d4f8b5cd5b9c2415e291896b83267e1b4d5feBrad Ebinger                mConnectionService.onCallAudioStateChanged(mConnectionId, state,
1084b32d4f8b5cd5b9c2415e291896b83267e1b4d5feBrad Ebinger                        null /*Session.Info*/);
1085091768c3021d740b7d66846d36405c4d4c76cc56Sailesh Nepal            }
1086091768c3021d740b7d66846d36405c4d4c76cc56Sailesh Nepal        } catch (RemoteException ignored) {
1087091768c3021d740b7d66846d36405c4d4c76cc56Sailesh Nepal        }
1088091768c3021d740b7d66846d36405c4d4c76cc56Sailesh Nepal    }
1089091768c3021d740b7d66846d36405c4d4c76cc56Sailesh Nepal
109052d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon    /**
109157006aa82a69740df73415a456d31993e2785e24Hall Liu     * Notifies this {@link RemoteConnection} that the user has requested an RTT session.
109257006aa82a69740df73415a456d31993e2785e24Hall Liu     * @param rttTextStream The object that should be used to send text to or receive text from
109357006aa82a69740df73415a456d31993e2785e24Hall Liu     *                      the in-call app.
109457006aa82a69740df73415a456d31993e2785e24Hall Liu     * @hide
109557006aa82a69740df73415a456d31993e2785e24Hall Liu     */
109657006aa82a69740df73415a456d31993e2785e24Hall Liu    public void startRtt(@NonNull Connection.RttTextStream rttTextStream) {
109757006aa82a69740df73415a456d31993e2785e24Hall Liu        try {
109857006aa82a69740df73415a456d31993e2785e24Hall Liu            if (mConnected) {
109957006aa82a69740df73415a456d31993e2785e24Hall Liu                mConnectionService.startRtt(mConnectionId, rttTextStream.getFdFromInCall(),
110057006aa82a69740df73415a456d31993e2785e24Hall Liu                        rttTextStream.getFdToInCall(), null /*Session.Info*/);
110157006aa82a69740df73415a456d31993e2785e24Hall Liu            }
110257006aa82a69740df73415a456d31993e2785e24Hall Liu        } catch (RemoteException ignored) {
110357006aa82a69740df73415a456d31993e2785e24Hall Liu        }
110457006aa82a69740df73415a456d31993e2785e24Hall Liu    }
110557006aa82a69740df73415a456d31993e2785e24Hall Liu
110657006aa82a69740df73415a456d31993e2785e24Hall Liu    /**
110757006aa82a69740df73415a456d31993e2785e24Hall Liu     * Notifies this {@link RemoteConnection} that it should terminate any existing RTT
110857006aa82a69740df73415a456d31993e2785e24Hall Liu     * session. No response to Telecom is needed for this method.
110957006aa82a69740df73415a456d31993e2785e24Hall Liu     * @hide
111057006aa82a69740df73415a456d31993e2785e24Hall Liu     */
111157006aa82a69740df73415a456d31993e2785e24Hall Liu    public void stopRtt() {
111257006aa82a69740df73415a456d31993e2785e24Hall Liu        try {
111357006aa82a69740df73415a456d31993e2785e24Hall Liu            if (mConnected) {
111457006aa82a69740df73415a456d31993e2785e24Hall Liu                mConnectionService.stopRtt(mConnectionId, null /*Session.Info*/);
111557006aa82a69740df73415a456d31993e2785e24Hall Liu            }
111657006aa82a69740df73415a456d31993e2785e24Hall Liu        } catch (RemoteException ignored) {
111757006aa82a69740df73415a456d31993e2785e24Hall Liu        }
111857006aa82a69740df73415a456d31993e2785e24Hall Liu    }
111957006aa82a69740df73415a456d31993e2785e24Hall Liu
112057006aa82a69740df73415a456d31993e2785e24Hall Liu    /**
112157006aa82a69740df73415a456d31993e2785e24Hall Liu     * Notifies this {@link RemoteConnection} of a response to a previous remotely-initiated RTT
112257006aa82a69740df73415a456d31993e2785e24Hall Liu     * upgrade request sent via {@link Connection#sendRemoteRttRequest}.
112357006aa82a69740df73415a456d31993e2785e24Hall Liu     * Acceptance of the request is indicated by the supplied {@link RttTextStream} being non-null,
112457006aa82a69740df73415a456d31993e2785e24Hall Liu     * and rejection is indicated by {@code rttTextStream} being {@code null}
112557006aa82a69740df73415a456d31993e2785e24Hall Liu     * @hide
112657006aa82a69740df73415a456d31993e2785e24Hall Liu     * @param rttTextStream The object that should be used to send text to or receive text from
112757006aa82a69740df73415a456d31993e2785e24Hall Liu     *                      the in-call app.
112857006aa82a69740df73415a456d31993e2785e24Hall Liu     */
112957006aa82a69740df73415a456d31993e2785e24Hall Liu    public void sendRttUpgradeResponse(@Nullable Connection.RttTextStream rttTextStream) {
113057006aa82a69740df73415a456d31993e2785e24Hall Liu        try {
113157006aa82a69740df73415a456d31993e2785e24Hall Liu            if (mConnected) {
113257006aa82a69740df73415a456d31993e2785e24Hall Liu                if (rttTextStream == null) {
113357006aa82a69740df73415a456d31993e2785e24Hall Liu                    mConnectionService.respondToRttUpgradeRequest(mConnectionId,
113457006aa82a69740df73415a456d31993e2785e24Hall Liu                            null, null, null /*Session.Info*/);
113557006aa82a69740df73415a456d31993e2785e24Hall Liu                } else {
113657006aa82a69740df73415a456d31993e2785e24Hall Liu                    mConnectionService.respondToRttUpgradeRequest(mConnectionId,
113757006aa82a69740df73415a456d31993e2785e24Hall Liu                            rttTextStream.getFdFromInCall(), rttTextStream.getFdToInCall(),
113857006aa82a69740df73415a456d31993e2785e24Hall Liu                            null /*Session.Info*/);
113957006aa82a69740df73415a456d31993e2785e24Hall Liu                }
114057006aa82a69740df73415a456d31993e2785e24Hall Liu            }
114157006aa82a69740df73415a456d31993e2785e24Hall Liu        } catch (RemoteException ignored) {
114257006aa82a69740df73415a456d31993e2785e24Hall Liu        }
114357006aa82a69740df73415a456d31993e2785e24Hall Liu    }
114457006aa82a69740df73415a456d31993e2785e24Hall Liu
114557006aa82a69740df73415a456d31993e2785e24Hall Liu    /**
1146b8e85c74e5910a461078704048d67f82b216508cIhab Awad     * Obtain the {@code RemoteConnection}s with which this {@code RemoteConnection} may be
1147b8e85c74e5910a461078704048d67f82b216508cIhab Awad     * successfully asked to create a conference with.
1148b8e85c74e5910a461078704048d67f82b216508cIhab Awad     *
1149b8e85c74e5910a461078704048d67f82b216508cIhab Awad     * @return The {@code RemoteConnection}s with which this {@code RemoteConnection} may be
1150b8e85c74e5910a461078704048d67f82b216508cIhab Awad     *         merged into a {@link RemoteConference}.
1151b8e85c74e5910a461078704048d67f82b216508cIhab Awad     */
1152b8e85c74e5910a461078704048d67f82b216508cIhab Awad    public List<RemoteConnection> getConferenceableConnections() {
1153b8e85c74e5910a461078704048d67f82b216508cIhab Awad        return mUnmodifiableconferenceableConnections;
1154b8e85c74e5910a461078704048d67f82b216508cIhab Awad    }
1155b8e85c74e5910a461078704048d67f82b216508cIhab Awad
1156b8e85c74e5910a461078704048d67f82b216508cIhab Awad    /**
1157b8e85c74e5910a461078704048d67f82b216508cIhab Awad     * Obtain the {@code RemoteConference} that this {@code RemoteConnection} may be a part
1158b8e85c74e5910a461078704048d67f82b216508cIhab Awad     * of, or {@code null} if there is no such {@code RemoteConference}.
1159b8e85c74e5910a461078704048d67f82b216508cIhab Awad     *
1160b8e85c74e5910a461078704048d67f82b216508cIhab Awad     * @return A {@code RemoteConference} or {@code null};
1161b8e85c74e5910a461078704048d67f82b216508cIhab Awad     */
1162b8e85c74e5910a461078704048d67f82b216508cIhab Awad    public RemoteConference getConference() {
1163b8e85c74e5910a461078704048d67f82b216508cIhab Awad        return mConference;
1164b8e85c74e5910a461078704048d67f82b216508cIhab Awad    }
1165b8e85c74e5910a461078704048d67f82b216508cIhab Awad
1166b8e85c74e5910a461078704048d67f82b216508cIhab Awad    /** {@hide} */
1167b8e85c74e5910a461078704048d67f82b216508cIhab Awad    String getId() {
1168b8e85c74e5910a461078704048d67f82b216508cIhab Awad        return mConnectionId;
1169b8e85c74e5910a461078704048d67f82b216508cIhab Awad    }
1170b8e85c74e5910a461078704048d67f82b216508cIhab Awad
1171b8e85c74e5910a461078704048d67f82b216508cIhab Awad    /** {@hide} */
1172b8e85c74e5910a461078704048d67f82b216508cIhab Awad    IConnectionService getConnectionService() {
1173b8e85c74e5910a461078704048d67f82b216508cIhab Awad        return mConnectionService;
1174b8e85c74e5910a461078704048d67f82b216508cIhab Awad    }
1175b8e85c74e5910a461078704048d67f82b216508cIhab Awad
1176b8e85c74e5910a461078704048d67f82b216508cIhab Awad    /**
117752d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon     * @hide
117852d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon     */
1179011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee    void setState(final int state) {
118052d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon        if (mState != state) {
118152d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon            mState = state;
1182011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee            for (CallbackRecord record: mCallbackRecords) {
1183011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee                final RemoteConnection connection = this;
1184011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee                final Callback callback = record.getCallback();
1185011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee                record.getHandler().post(new Runnable() {
1186011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee                    @Override
1187011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee                    public void run() {
1188011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee                        callback.onStateChanged(connection, state);
1189011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee                    }
1190011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee                });
119152d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon            }
119252d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon        }
119352d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon    }
119452d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon
119552d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon    /**
119652d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon     * @hide
119752d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon     */
1198011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee    void setDisconnected(final DisconnectCause disconnectCause) {
1199b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        if (mState != Connection.STATE_DISCONNECTED) {
1200b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            mState = Connection.STATE_DISCONNECTED;
12017f3d41fd124dd7c4a8b72c1d48df08a8ee7209ecAndrew Lee            mDisconnectCause = disconnectCause;
120252d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon
1203011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee            for (CallbackRecord record : mCallbackRecords) {
1204011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee                final RemoteConnection connection = this;
1205011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee                final Callback callback = record.getCallback();
1206011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee                record.getHandler().post(new Runnable() {
1207011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee                    @Override
1208011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee                    public void run() {
1209011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee                        callback.onDisconnected(connection, disconnectCause);
1210011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee                    }
1211011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee                });
121252d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon            }
121352d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon        }
121452d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon    }
121552d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon
121652d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon    /**
121752d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon     * @hide
121852d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon     */
1219011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee    void setRingbackRequested(final boolean ringback) {
1220100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee        if (mRingbackRequested != ringback) {
1221100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee            mRingbackRequested = ringback;
1222011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee            for (CallbackRecord record : mCallbackRecords) {
1223011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee                final RemoteConnection connection = this;
1224011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee                final Callback callback = record.getCallback();
1225011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee                record.getHandler().post(new Runnable() {
1226011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee                    @Override
1227011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee                    public void run() {
1228011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee                        callback.onRingbackRequested(connection, ringback);
1229011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee                    }
1230011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee                });
123152d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon            }
123252d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon        }
123352d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon    }
123452d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon
123552d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon    /**
123652d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon     * @hide
123752d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon     */
1238011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee    void setConnectionCapabilities(final int connectionCapabilities) {
12395c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        mConnectionCapabilities = connectionCapabilities;
1240011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee        for (CallbackRecord record : mCallbackRecords) {
1241011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee            final RemoteConnection connection = this;
1242011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee            final Callback callback = record.getCallback();
1243011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee            record.getHandler().post(new Runnable() {
1244011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee                @Override
1245011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee                public void run() {
1246011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee                    callback.onConnectionCapabilitiesChanged(connection, connectionCapabilities);
1247011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee                }
1248011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee            });
12491a7061ba950538c93d92c0448752a212039cc06aSailesh Nepal        }
12501a7061ba950538c93d92c0448752a212039cc06aSailesh Nepal    }
12511a7061ba950538c93d92c0448752a212039cc06aSailesh Nepal
12521a7061ba950538c93d92c0448752a212039cc06aSailesh Nepal    /**
12531a7061ba950538c93d92c0448752a212039cc06aSailesh Nepal     * @hide
12541a7061ba950538c93d92c0448752a212039cc06aSailesh Nepal     */
1255720c664401081ca00e56c7eef12641ae792da530Tyler Gunn    void setConnectionProperties(final int connectionProperties) {
1256720c664401081ca00e56c7eef12641ae792da530Tyler Gunn        mConnectionProperties = connectionProperties;
1257720c664401081ca00e56c7eef12641ae792da530Tyler Gunn        for (CallbackRecord record : mCallbackRecords) {
1258720c664401081ca00e56c7eef12641ae792da530Tyler Gunn            final RemoteConnection connection = this;
1259720c664401081ca00e56c7eef12641ae792da530Tyler Gunn            final Callback callback = record.getCallback();
1260720c664401081ca00e56c7eef12641ae792da530Tyler Gunn            record.getHandler().post(new Runnable() {
1261720c664401081ca00e56c7eef12641ae792da530Tyler Gunn                @Override
1262720c664401081ca00e56c7eef12641ae792da530Tyler Gunn                public void run() {
1263720c664401081ca00e56c7eef12641ae792da530Tyler Gunn                    callback.onConnectionPropertiesChanged(connection, connectionProperties);
1264720c664401081ca00e56c7eef12641ae792da530Tyler Gunn                }
1265720c664401081ca00e56c7eef12641ae792da530Tyler Gunn            });
1266720c664401081ca00e56c7eef12641ae792da530Tyler Gunn        }
1267720c664401081ca00e56c7eef12641ae792da530Tyler Gunn    }
1268720c664401081ca00e56c7eef12641ae792da530Tyler Gunn
1269720c664401081ca00e56c7eef12641ae792da530Tyler Gunn    /**
1270720c664401081ca00e56c7eef12641ae792da530Tyler Gunn     * @hide
1271720c664401081ca00e56c7eef12641ae792da530Tyler Gunn     */
127252d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon    void setDestroyed() {
1273011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee        if (!mCallbackRecords.isEmpty()) {
1274100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee            // Make sure that the callbacks are notified that the call is destroyed first.
1275b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            if (mState != Connection.STATE_DISCONNECTED) {
12767f3d41fd124dd7c4a8b72c1d48df08a8ee7209ecAndrew Lee                setDisconnected(
12777f3d41fd124dd7c4a8b72c1d48df08a8ee7209ecAndrew Lee                        new DisconnectCause(DisconnectCause.ERROR, "Connection destroyed."));
127852d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon            }
127952d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon
1280011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee            for (CallbackRecord record : mCallbackRecords) {
1281011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee                final RemoteConnection connection = this;
1282011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee                final Callback callback = record.getCallback();
1283011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee                record.getHandler().post(new Runnable() {
1284011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee                    @Override
1285011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee                    public void run() {
1286011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee                        callback.onDestroyed(connection);
1287011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee                    }
1288011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee                });
128952d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon            }
1290011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee            mCallbackRecords.clear();
129152d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon
129252d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon            mConnected = false;
129352d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon        }
129452d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon    }
129552d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon
129652d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon    /**
129752d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon     * @hide
129852d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon     */
1299011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee    void setPostDialWait(final String remainingDigits) {
1300011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee        for (CallbackRecord record : mCallbackRecords) {
1301011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee            final RemoteConnection connection = this;
1302011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee            final Callback callback = record.getCallback();
1303011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee            record.getHandler().post(new Runnable() {
1304011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee                @Override
1305011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee                public void run() {
1306011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee                    callback.onPostDialWait(connection, remainingDigits);
1307011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee                }
1308011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee            });
130952d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon        }
1310aa07df84f279a87ad6370758c9d792a660f2cebbTyler Gunn    }
1311aa07df84f279a87ad6370758c9d792a660f2cebbTyler Gunn
1312aa07df84f279a87ad6370758c9d792a660f2cebbTyler Gunn    /**
1313aa07df84f279a87ad6370758c9d792a660f2cebbTyler Gunn     * @hide
1314aa07df84f279a87ad6370758c9d792a660f2cebbTyler Gunn     */
1315011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee    void onPostDialChar(final char nextChar) {
1316011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee        for (CallbackRecord record : mCallbackRecords) {
1317011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee            final RemoteConnection connection = this;
1318011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee            final Callback callback = record.getCallback();
1319011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee            record.getHandler().post(new Runnable() {
1320011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee                @Override
1321011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee                public void run() {
132240451b3977f51bd0726b645f73167869f71d4e4cSailesh Nepal                    callback.onPostDialChar(connection, nextChar);
1323011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee                }
1324011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee            });
132527d1c2d148fe377ca0d2744f0f85789a42c8f808Nancy Chen        }
132627d1c2d148fe377ca0d2744f0f85789a42c8f808Nancy Chen    }
132727d1c2d148fe377ca0d2744f0f85789a42c8f808Nancy Chen
132827d1c2d148fe377ca0d2744f0f85789a42c8f808Nancy Chen    /**
132927d1c2d148fe377ca0d2744f0f85789a42c8f808Nancy Chen     * @hide
133027d1c2d148fe377ca0d2744f0f85789a42c8f808Nancy Chen     */
1331011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee    void setVideoState(final int videoState) {
1332aa07df84f279a87ad6370758c9d792a660f2cebbTyler Gunn        mVideoState = videoState;
1333011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee        for (CallbackRecord record : mCallbackRecords) {
1334011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee            final RemoteConnection connection = this;
1335011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee            final Callback callback = record.getCallback();
1336011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee            record.getHandler().post(new Runnable() {
1337011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee                @Override
1338011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee                public void run() {
1339011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee                    callback.onVideoStateChanged(connection, videoState);
1340011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee                }
1341011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee            });
1342aa07df84f279a87ad6370758c9d792a660f2cebbTyler Gunn        }
134352d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon    }
13442a46b90222e5c9c73de012382a604a71f9c0c30cSailesh Nepal
1345a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad    /**
1346a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad     * @hide
1347a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad     */
1348011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee    void setVideoProvider(final VideoProvider videoProvider) {
1349a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad        mVideoProvider = videoProvider;
1350011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee        for (CallbackRecord record : mCallbackRecords) {
1351011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee            final RemoteConnection connection = this;
1352011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee            final Callback callback = record.getCallback();
1353011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee            record.getHandler().post(new Runnable() {
1354011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee                @Override
1355011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee                public void run() {
1356011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee                    callback.onVideoProviderChanged(connection, videoProvider);
1357011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee                }
1358011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee            });
1359a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad        }
1360a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad    }
1361a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad
136233aaae4a07fdcce223fe74d96d751f4bffa6723aSailesh Nepal    /** @hide */
1363011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee    void setIsVoipAudioMode(final boolean isVoip) {
1364100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee        mIsVoipAudioMode = isVoip;
1365011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee        for (CallbackRecord record : mCallbackRecords) {
1366011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee            final RemoteConnection connection = this;
1367011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee            final Callback callback = record.getCallback();
1368011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee            record.getHandler().post(new Runnable() {
1369011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee                @Override
1370011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee                public void run() {
1371011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee                    callback.onVoipAudioChanged(connection, isVoip);
1372011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee                }
1373011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee            });
137433aaae4a07fdcce223fe74d96d751f4bffa6723aSailesh Nepal        }
137533aaae4a07fdcce223fe74d96d751f4bffa6723aSailesh Nepal    }
1376e7ef59a77d55c9802cc7d919f7dd794bd5fea30eSailesh Nepal
1377e7ef59a77d55c9802cc7d919f7dd794bd5fea30eSailesh Nepal    /** @hide */
1378011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee    void setStatusHints(final StatusHints statusHints) {
1379e7ef59a77d55c9802cc7d919f7dd794bd5fea30eSailesh Nepal        mStatusHints = statusHints;
1380011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee        for (CallbackRecord record : mCallbackRecords) {
1381011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee            final RemoteConnection connection = this;
1382011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee            final Callback callback = record.getCallback();
1383011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee            record.getHandler().post(new Runnable() {
1384011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee                @Override
1385011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee                public void run() {
1386011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee                    callback.onStatusHintsChanged(connection, statusHints);
1387011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee                }
1388011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee            });
1389612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepal        }
1390612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepal    }
1391612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepal
1392612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepal    /** @hide */
1393011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee    void setAddress(final Uri address, final int presentation) {
1394100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee        mAddress = address;
1395100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee        mAddressPresentation = presentation;
1396011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee        for (CallbackRecord record : mCallbackRecords) {
1397011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee            final RemoteConnection connection = this;
1398011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee            final Callback callback = record.getCallback();
1399011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee            record.getHandler().post(new Runnable() {
1400011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee                @Override
1401011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee                public void run() {
1402011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee                    callback.onAddressChanged(connection, address, presentation);
1403011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee                }
1404011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee            });
1405612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepal        }
1406612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepal    }
1407612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepal
1408612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepal    /** @hide */
1409011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee    void setCallerDisplayName(final String callerDisplayName, final int presentation) {
1410612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepal        mCallerDisplayName = callerDisplayName;
1411612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepal        mCallerDisplayNamePresentation = presentation;
1412011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee        for (CallbackRecord record : mCallbackRecords) {
1413011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee            final RemoteConnection connection = this;
1414011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee            final Callback callback = record.getCallback();
1415011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee            record.getHandler().post(new Runnable() {
1416011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee                @Override
1417011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee                public void run() {
1418011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee                    callback.onCallerDisplayNameChanged(
1419011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee                            connection, callerDisplayName, presentation);
1420011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee                }
1421011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee            });
1422e7ef59a77d55c9802cc7d919f7dd794bd5fea30eSailesh Nepal        }
1423e7ef59a77d55c9802cc7d919f7dd794bd5fea30eSailesh Nepal    }
14242ab88cc313fc4af7fb9436e236cd3a5d1ac58478Sailesh Nepal
14252ab88cc313fc4af7fb9436e236cd3a5d1ac58478Sailesh Nepal    /** @hide */
1426011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee    void setConferenceableConnections(final List<RemoteConnection> conferenceableConnections) {
14277c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon        mConferenceableConnections.clear();
14287c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon        mConferenceableConnections.addAll(conferenceableConnections);
1429011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee        for (CallbackRecord record : mCallbackRecords) {
1430011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee            final RemoteConnection connection = this;
1431011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee            final Callback callback = record.getCallback();
1432011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee            record.getHandler().post(new Runnable() {
1433011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee                @Override
1434011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee                public void run() {
1435011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee                    callback.onConferenceableConnectionsChanged(
1436011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee                            connection, mUnmodifiableconferenceableConnections);
1437011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee                }
1438011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee            });
1439b8e85c74e5910a461078704048d67f82b216508cIhab Awad        }
1440b8e85c74e5910a461078704048d67f82b216508cIhab Awad    }
1441b8e85c74e5910a461078704048d67f82b216508cIhab Awad
1442b8e85c74e5910a461078704048d67f82b216508cIhab Awad    /** @hide */
1443011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee    void setConference(final RemoteConference conference) {
1444b8e85c74e5910a461078704048d67f82b216508cIhab Awad        if (mConference != conference) {
1445b8e85c74e5910a461078704048d67f82b216508cIhab Awad            mConference = conference;
1446011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee            for (CallbackRecord record : mCallbackRecords) {
1447011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee                final RemoteConnection connection = this;
1448011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee                final Callback callback = record.getCallback();
1449011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee                record.getHandler().post(new Runnable() {
1450011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee                    @Override
1451011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee                    public void run() {
1452011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee                        callback.onConferenceChanged(connection, conference);
1453011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee                    }
1454011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee                });
1455b8e85c74e5910a461078704048d67f82b216508cIhab Awad            }
14567c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon        }
14577c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon    }
14587c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon
14596b7f955c2d9b231660b8c54f8ef8e8e6ad802625Santos Cordon    /** @hide */
1460dee56a8a79f9daa1e597f5d4f399d3a5feedcac4Tyler Gunn    void putExtras(final Bundle extras) {
14612282bb97e78ea87ff322ecf12563ab0120af2b28Tyler Gunn        if (extras == null) {
14622282bb97e78ea87ff322ecf12563ab0120af2b28Tyler Gunn            return;
14632282bb97e78ea87ff322ecf12563ab0120af2b28Tyler Gunn        }
1464dee56a8a79f9daa1e597f5d4f399d3a5feedcac4Tyler Gunn        if (mExtras == null) {
1465dee56a8a79f9daa1e597f5d4f399d3a5feedcac4Tyler Gunn            mExtras = new Bundle();
1466dee56a8a79f9daa1e597f5d4f399d3a5feedcac4Tyler Gunn        }
1467dee56a8a79f9daa1e597f5d4f399d3a5feedcac4Tyler Gunn        mExtras.putAll(extras);
1468dee56a8a79f9daa1e597f5d4f399d3a5feedcac4Tyler Gunn
1469dee56a8a79f9daa1e597f5d4f399d3a5feedcac4Tyler Gunn        notifyExtrasChanged();
1470dee56a8a79f9daa1e597f5d4f399d3a5feedcac4Tyler Gunn    }
1471dee56a8a79f9daa1e597f5d4f399d3a5feedcac4Tyler Gunn
1472dee56a8a79f9daa1e597f5d4f399d3a5feedcac4Tyler Gunn    /** @hide */
1473dee56a8a79f9daa1e597f5d4f399d3a5feedcac4Tyler Gunn    void removeExtras(List<String> keys) {
1474dee56a8a79f9daa1e597f5d4f399d3a5feedcac4Tyler Gunn        if (mExtras == null || keys == null || keys.isEmpty()) {
1475dee56a8a79f9daa1e597f5d4f399d3a5feedcac4Tyler Gunn            return;
1476dee56a8a79f9daa1e597f5d4f399d3a5feedcac4Tyler Gunn        }
1477dee56a8a79f9daa1e597f5d4f399d3a5feedcac4Tyler Gunn        for (String key : keys) {
1478dee56a8a79f9daa1e597f5d4f399d3a5feedcac4Tyler Gunn            mExtras.remove(key);
1479dee56a8a79f9daa1e597f5d4f399d3a5feedcac4Tyler Gunn        }
1480dee56a8a79f9daa1e597f5d4f399d3a5feedcac4Tyler Gunn
1481dee56a8a79f9daa1e597f5d4f399d3a5feedcac4Tyler Gunn        notifyExtrasChanged();
1482dee56a8a79f9daa1e597f5d4f399d3a5feedcac4Tyler Gunn    }
1483dee56a8a79f9daa1e597f5d4f399d3a5feedcac4Tyler Gunn
1484dee56a8a79f9daa1e597f5d4f399d3a5feedcac4Tyler Gunn    private void notifyExtrasChanged() {
14856b7f955c2d9b231660b8c54f8ef8e8e6ad802625Santos Cordon        for (CallbackRecord record : mCallbackRecords) {
14866b7f955c2d9b231660b8c54f8ef8e8e6ad802625Santos Cordon            final RemoteConnection connection = this;
14876b7f955c2d9b231660b8c54f8ef8e8e6ad802625Santos Cordon            final Callback callback = record.getCallback();
14886b7f955c2d9b231660b8c54f8ef8e8e6ad802625Santos Cordon            record.getHandler().post(new Runnable() {
14896b7f955c2d9b231660b8c54f8ef8e8e6ad802625Santos Cordon                @Override
14906b7f955c2d9b231660b8c54f8ef8e8e6ad802625Santos Cordon                public void run() {
1491dee56a8a79f9daa1e597f5d4f399d3a5feedcac4Tyler Gunn                    callback.onExtrasChanged(connection, mExtras);
14926b7f955c2d9b231660b8c54f8ef8e8e6ad802625Santos Cordon                }
14936b7f955c2d9b231660b8c54f8ef8e8e6ad802625Santos Cordon            });
14946b7f955c2d9b231660b8c54f8ef8e8e6ad802625Santos Cordon        }
14956b7f955c2d9b231660b8c54f8ef8e8e6ad802625Santos Cordon    }
14966b7f955c2d9b231660b8c54f8ef8e8e6ad802625Santos Cordon
1497bd1eb1f105e99d55fe87d758e8eafbe55a221a30Tyler Gunn    /** @hide */
1498876dbfb4767da4a2ba5459d5b78fb6eb55e4516fTyler Gunn    void onConnectionEvent(final String event, final Bundle extras) {
1499bd1eb1f105e99d55fe87d758e8eafbe55a221a30Tyler Gunn        for (CallbackRecord record : mCallbackRecords) {
1500bd1eb1f105e99d55fe87d758e8eafbe55a221a30Tyler Gunn            final RemoteConnection connection = this;
1501bd1eb1f105e99d55fe87d758e8eafbe55a221a30Tyler Gunn            final Callback callback = record.getCallback();
1502bd1eb1f105e99d55fe87d758e8eafbe55a221a30Tyler Gunn            record.getHandler().post(new Runnable() {
1503bd1eb1f105e99d55fe87d758e8eafbe55a221a30Tyler Gunn                @Override
1504bd1eb1f105e99d55fe87d758e8eafbe55a221a30Tyler Gunn                public void run() {
1505876dbfb4767da4a2ba5459d5b78fb6eb55e4516fTyler Gunn                    callback.onConnectionEvent(connection, event, extras);
1506bd1eb1f105e99d55fe87d758e8eafbe55a221a30Tyler Gunn                }
1507bd1eb1f105e99d55fe87d758e8eafbe55a221a30Tyler Gunn            });
1508bd1eb1f105e99d55fe87d758e8eafbe55a221a30Tyler Gunn        }
1509bd1eb1f105e99d55fe87d758e8eafbe55a221a30Tyler Gunn    }
1510bd1eb1f105e99d55fe87d758e8eafbe55a221a30Tyler Gunn
151157006aa82a69740df73415a456d31993e2785e24Hall Liu    /** @hide */
151257006aa82a69740df73415a456d31993e2785e24Hall Liu    void onRttInitiationSuccess() {
151357006aa82a69740df73415a456d31993e2785e24Hall Liu        for (CallbackRecord record : mCallbackRecords) {
151457006aa82a69740df73415a456d31993e2785e24Hall Liu            final RemoteConnection connection = this;
151557006aa82a69740df73415a456d31993e2785e24Hall Liu            final Callback callback = record.getCallback();
151657006aa82a69740df73415a456d31993e2785e24Hall Liu            record.getHandler().post(
151757006aa82a69740df73415a456d31993e2785e24Hall Liu                    () -> callback.onRttInitiationSuccess(connection));
151857006aa82a69740df73415a456d31993e2785e24Hall Liu        }
151957006aa82a69740df73415a456d31993e2785e24Hall Liu    }
152057006aa82a69740df73415a456d31993e2785e24Hall Liu
152157006aa82a69740df73415a456d31993e2785e24Hall Liu    /** @hide */
152257006aa82a69740df73415a456d31993e2785e24Hall Liu    void onRttInitiationFailure(int reason) {
152357006aa82a69740df73415a456d31993e2785e24Hall Liu        for (CallbackRecord record : mCallbackRecords) {
152457006aa82a69740df73415a456d31993e2785e24Hall Liu            final RemoteConnection connection = this;
152557006aa82a69740df73415a456d31993e2785e24Hall Liu            final Callback callback = record.getCallback();
152657006aa82a69740df73415a456d31993e2785e24Hall Liu            record.getHandler().post(
152757006aa82a69740df73415a456d31993e2785e24Hall Liu                    () -> callback.onRttInitiationFailure(connection, reason));
152857006aa82a69740df73415a456d31993e2785e24Hall Liu        }
152957006aa82a69740df73415a456d31993e2785e24Hall Liu    }
153057006aa82a69740df73415a456d31993e2785e24Hall Liu
153157006aa82a69740df73415a456d31993e2785e24Hall Liu    /** @hide */
153257006aa82a69740df73415a456d31993e2785e24Hall Liu    void onRttSessionRemotelyTerminated() {
153357006aa82a69740df73415a456d31993e2785e24Hall Liu        for (CallbackRecord record : mCallbackRecords) {
153457006aa82a69740df73415a456d31993e2785e24Hall Liu            final RemoteConnection connection = this;
153557006aa82a69740df73415a456d31993e2785e24Hall Liu            final Callback callback = record.getCallback();
153657006aa82a69740df73415a456d31993e2785e24Hall Liu            record.getHandler().post(
153757006aa82a69740df73415a456d31993e2785e24Hall Liu                    () -> callback.onRttSessionRemotelyTerminated(connection));
153857006aa82a69740df73415a456d31993e2785e24Hall Liu        }
153957006aa82a69740df73415a456d31993e2785e24Hall Liu    }
154057006aa82a69740df73415a456d31993e2785e24Hall Liu
154157006aa82a69740df73415a456d31993e2785e24Hall Liu    /** @hide */
154257006aa82a69740df73415a456d31993e2785e24Hall Liu    void onRemoteRttRequest() {
154357006aa82a69740df73415a456d31993e2785e24Hall Liu        for (CallbackRecord record : mCallbackRecords) {
154457006aa82a69740df73415a456d31993e2785e24Hall Liu            final RemoteConnection connection = this;
154557006aa82a69740df73415a456d31993e2785e24Hall Liu            final Callback callback = record.getCallback();
154657006aa82a69740df73415a456d31993e2785e24Hall Liu            record.getHandler().post(
154757006aa82a69740df73415a456d31993e2785e24Hall Liu                    () -> callback.onRemoteRttRequest(connection));
154857006aa82a69740df73415a456d31993e2785e24Hall Liu        }
154957006aa82a69740df73415a456d31993e2785e24Hall Liu    }
155057006aa82a69740df73415a456d31993e2785e24Hall Liu
155157006aa82a69740df73415a456d31993e2785e24Hall Liu    /**
1552bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton    /**
15536107bab041fb7d851fbf865b7310d294aae970c8Ihab Awad     * Create a RemoteConnection represents a failure, and which will be in
15546107bab041fb7d851fbf865b7310d294aae970c8Ihab Awad     * {@link Connection#STATE_DISCONNECTED}. Attempting to use it for anything will almost
15556107bab041fb7d851fbf865b7310d294aae970c8Ihab Awad     * certainly result in bad things happening. Do not do this.
1556bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton     *
1557bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton     * @return a failed {@link RemoteConnection}
1558bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton     *
1559bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton     * @hide
1560bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton     */
15617f3d41fd124dd7c4a8b72c1d48df08a8ee7209ecAndrew Lee    public static RemoteConnection failure(DisconnectCause disconnectCause) {
15627f3d41fd124dd7c4a8b72c1d48df08a8ee7209ecAndrew Lee        return new RemoteConnection(disconnectCause);
1563bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton    }
1564011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee
1565011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee    private static final class CallbackRecord extends Callback {
1566011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee        private final Callback mCallback;
1567011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee        private final Handler mHandler;
1568011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee
1569011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee        public CallbackRecord(Callback callback, Handler handler) {
1570011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee            mCallback = callback;
1571011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee            mHandler = handler;
1572011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee        }
1573011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee
1574011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee        public Callback getCallback() {
1575011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee            return mCallback;
1576011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee        }
1577011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee
1578011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee        public Handler getHandler() {
1579011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee            return mHandler;
1580011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee        }
1581011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee    }
158252d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon}
1583