RemoteConnection.java revision 87b73f370e2b8a76b0540580f43edba6ec21c6cf
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
236b7f955c2d9b231660b8c54f8ef8e8e6ad802625Santos Cordonimport android.annotation.Nullable;
244af5935c71f1e31ef1aec27661c4ef60545a0924Yorke Leeimport android.annotation.SystemApi;
2552d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordonimport android.net.Uri;
266b7f955c2d9b231660b8c54f8ef8e8e6ad802625Santos Cordonimport android.os.Bundle;
27011728fc3a4368b601844d225d1f37bf48ea5735Andrew Leeimport android.os.Handler;
28a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awadimport android.os.IBinder;
2952d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordonimport android.os.RemoteException;
30a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awadimport android.view.Surface;
3152d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon
327c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordonimport java.util.ArrayList;
33f4669dffd5d604f227ceb74c6ea86ee78a882e73Sailesh Nepalimport java.util.Collections;
345d0410fa7c2dead7906780551ba4aa0305021cefIhab Awadimport java.util.List;
3552d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordonimport java.util.Set;
36f4669dffd5d604f227ceb74c6ea86ee78a882e73Sailesh Nepalimport java.util.concurrent.ConcurrentHashMap;
3752d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon
3852d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon/**
39b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad * A connection provided to a {@link ConnectionService} by another {@code ConnectionService}
40b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad * running in a different process.
41b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad *
42b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad * @see ConnectionService#createRemoteOutgoingConnection(PhoneAccountHandle, ConnectionRequest)
43b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad * @see ConnectionService#createRemoteIncomingConnection(PhoneAccountHandle, ConnectionRequest)
4452d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon */
4552d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordonpublic final class RemoteConnection {
465d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad
47100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee    public static abstract class Callback {
485d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad        /**
495d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad         * Invoked when the state of this {@code RemoteConnection} has changed. See
505d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad         * {@link #getState()}.
515d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad         *
525d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad         * @param connection The {@code RemoteConnection} invoking this method.
535d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad         * @param state The new state of the {@code RemoteConnection}.
545d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad         */
55bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton        public void onStateChanged(RemoteConnection connection, int state) {}
565d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad
575d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad        /**
585d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad         * Invoked when this {@code RemoteConnection} is disconnected.
595d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad         *
605d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad         * @param connection The {@code RemoteConnection} invoking this method.
617f3d41fd124dd7c4a8b72c1d48df08a8ee7209ecAndrew Lee         * @param disconnectCause The ({@see DisconnectCause}) associated with this failed
627f3d41fd124dd7c4a8b72c1d48df08a8ee7209ecAndrew Lee         *     connection.
635d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad         */
645d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad        public void onDisconnected(
655d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad                RemoteConnection connection,
667f3d41fd124dd7c4a8b72c1d48df08a8ee7209ecAndrew Lee                DisconnectCause disconnectCause) {}
675d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad
685d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad        /**
695d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad         * Invoked when this {@code RemoteConnection} is requesting ringback. See
70100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee         * {@link #isRingbackRequested()}.
715d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad         *
725d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad         * @param connection The {@code RemoteConnection} invoking this method.
735d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad         * @param ringback Whether the {@code RemoteConnection} is requesting ringback.
745d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad         */
75100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee        public void onRingbackRequested(RemoteConnection connection, boolean ringback) {}
765d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad
775d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad        /**
785d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad         * Indicates that the call capabilities of this {@code RemoteConnection} have changed.
795c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad         * See {@link #getConnectionCapabilities()}.
805d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad         *
815d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad         * @param connection The {@code RemoteConnection} invoking this method.
825c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad         * @param connectionCapabilities The new capabilities of the {@code RemoteConnection}.
835d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad         */
845c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        public void onConnectionCapabilitiesChanged(
855c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad                RemoteConnection connection,
865c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad                int connectionCapabilities) {}
875d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad
885d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad        /**
895d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad         * Invoked when the post-dial sequence in the outgoing {@code Connection} has reached a
905d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad         * pause character. This causes the post-dial signals to stop pending user confirmation. An
915d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad         * implementation should present this choice to the user and invoke
92b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * {@link RemoteConnection#postDialContinue(boolean)} when the user makes the choice.
935d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad         *
945d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad         * @param connection The {@code RemoteConnection} invoking this method.
955d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad         * @param remainingPostDialSequence The post-dial characters that remain to be sent.
965d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad         */
975d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad        public void onPostDialWait(RemoteConnection connection, String remainingPostDialSequence) {}
985d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad
995d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad        /**
10027d1c2d148fe377ca0d2744f0f85789a42c8f808Nancy Chen         * Invoked when the post-dial sequence in the outgoing {@code Connection} has processed
10127d1c2d148fe377ca0d2744f0f85789a42c8f808Nancy Chen         * a character.
10227d1c2d148fe377ca0d2744f0f85789a42c8f808Nancy Chen         *
10327d1c2d148fe377ca0d2744f0f85789a42c8f808Nancy Chen         * @param connection The {@code RemoteConnection} invoking this method.
10427d1c2d148fe377ca0d2744f0f85789a42c8f808Nancy Chen         * @param nextChar The character being processed.
10527d1c2d148fe377ca0d2744f0f85789a42c8f808Nancy Chen         */
10627d1c2d148fe377ca0d2744f0f85789a42c8f808Nancy Chen        public void onPostDialChar(RemoteConnection connection, char nextChar) {}
10727d1c2d148fe377ca0d2744f0f85789a42c8f808Nancy Chen
10827d1c2d148fe377ca0d2744f0f85789a42c8f808Nancy Chen        /**
1095d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad         * Indicates that the VOIP audio status of this {@code RemoteConnection} has changed.
110100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee         * See {@link #isVoipAudioMode()}.
1115d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad         *
1125d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad         * @param connection The {@code RemoteConnection} invoking this method.
1135d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad         * @param isVoip Whether the new audio state of the {@code RemoteConnection} is VOIP.
1145d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad         */
115100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee        public void onVoipAudioChanged(RemoteConnection connection, boolean isVoip) {}
1165d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad
1175d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad        /**
1185d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad         * Indicates that the status hints of this {@code RemoteConnection} have changed. See
1195d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad         * {@link #getStatusHints()} ()}.
1205d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad         *
1215d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad         * @param connection The {@code RemoteConnection} invoking this method.
1225d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad         * @param statusHints The new status hints of the {@code RemoteConnection}.
1235d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad         */
124bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton        public void onStatusHintsChanged(RemoteConnection connection, StatusHints statusHints) {}
1255d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad
1265d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad        /**
127100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee         * Indicates that the address (e.g., phone number) of this {@code RemoteConnection} has
128100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee         * changed. See {@link #getAddress()} and {@link #getAddressPresentation()}.
1295d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad         *
1305d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad         * @param connection The {@code RemoteConnection} invoking this method.
131100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee         * @param address The new address of the {@code RemoteConnection}.
132100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee         * @param presentation The presentation requirements for the address.
133ef9f6f957d897ea0ed82114185b8fa3fefd4917bTyler Gunn         *        See {@link TelecomManager} for valid values.
1345d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad         */
135100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee        public void onAddressChanged(RemoteConnection connection, Uri address, int presentation) {}
1365d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad
1375d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad        /**
1385d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad         * Indicates that the caller display name of this {@code RemoteConnection} has changed.
1395d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad         * See {@link #getCallerDisplayName()} and {@link #getCallerDisplayNamePresentation()}.
1405d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad         *
1415d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad         * @param connection The {@code RemoteConnection} invoking this method.
1425d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad         * @param callerDisplayName The new caller display name of the {@code RemoteConnection}.
1439d568c01db1f90fbe9cbff1d9385e7e7b809e066Nancy Chen         * @param presentation The presentation requirements for the handle.
144ef9f6f957d897ea0ed82114185b8fa3fefd4917bTyler Gunn         *        See {@link TelecomManager} for valid values.
1455d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad         */
146bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton        public void onCallerDisplayNameChanged(
147bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton                RemoteConnection connection, String callerDisplayName, int presentation) {}
1485d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad
1495d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad        /**
1505d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad         * Indicates that the video state of this {@code RemoteConnection} has changed.
1515d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad         * See {@link #getVideoState()}.
1525d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad         *
1535d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad         * @param connection The {@code RemoteConnection} invoking this method.
1545d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad         * @param videoState The new video state of the {@code RemoteConnection}.
1555d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad         */
156bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton        public void onVideoStateChanged(RemoteConnection connection, int videoState) {}
1575d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad
1585d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad        /**
1595d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad         * Indicates that this {@code RemoteConnection} has been destroyed. No further requests
1605d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad         * should be made to the {@code RemoteConnection}, and references to it should be cleared.
1615d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad         *
1625d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad         * @param connection The {@code RemoteConnection} invoking this method.
1635d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad         */
164bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton        public void onDestroyed(RemoteConnection connection) {}
165b8e85c74e5910a461078704048d67f82b216508cIhab Awad
166b8e85c74e5910a461078704048d67f82b216508cIhab Awad        /**
167b8e85c74e5910a461078704048d67f82b216508cIhab Awad         * Indicates that the {@code RemoteConnection}s with which this {@code RemoteConnection}
168b8e85c74e5910a461078704048d67f82b216508cIhab Awad         * may be asked to create a conference has changed.
169b8e85c74e5910a461078704048d67f82b216508cIhab Awad         *
170b8e85c74e5910a461078704048d67f82b216508cIhab Awad         * @param connection The {@code RemoteConnection} invoking this method.
171b8e85c74e5910a461078704048d67f82b216508cIhab Awad         * @param conferenceableConnections The {@code RemoteConnection}s with which this
172b8e85c74e5910a461078704048d67f82b216508cIhab Awad         *         {@code RemoteConnection} may be asked to create a conference.
173b8e85c74e5910a461078704048d67f82b216508cIhab Awad         */
1747c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon        public void onConferenceableConnectionsChanged(
175b8e85c74e5910a461078704048d67f82b216508cIhab Awad                RemoteConnection connection,
176b8e85c74e5910a461078704048d67f82b216508cIhab Awad                List<RemoteConnection> conferenceableConnections) {}
177b8e85c74e5910a461078704048d67f82b216508cIhab Awad
178b8e85c74e5910a461078704048d67f82b216508cIhab Awad        /**
179a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad         * Indicates that the {@code VideoProvider} associated with this {@code RemoteConnection}
180a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad         * has changed.
181a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad         *
182a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad         * @param connection The {@code RemoteConnection} invoking this method.
183a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad         * @param videoProvider The new {@code VideoProvider} associated with this
184a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad         *         {@code RemoteConnection}.
185a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad         */
186a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad        public void onVideoProviderChanged(
187a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad                RemoteConnection connection, VideoProvider videoProvider) {}
188a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad
189a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad        /**
190b8e85c74e5910a461078704048d67f82b216508cIhab Awad         * Indicates that the {@code RemoteConference} that this {@code RemoteConnection} is a part
191b8e85c74e5910a461078704048d67f82b216508cIhab Awad         * of has changed.
192b8e85c74e5910a461078704048d67f82b216508cIhab Awad         *
193b8e85c74e5910a461078704048d67f82b216508cIhab Awad         * @param connection The {@code RemoteConnection} invoking this method.
194b8e85c74e5910a461078704048d67f82b216508cIhab Awad         * @param conference The {@code RemoteConference} of which this {@code RemoteConnection} is
195b8e85c74e5910a461078704048d67f82b216508cIhab Awad         *         a part, which may be {@code null}.
196b8e85c74e5910a461078704048d67f82b216508cIhab Awad         */
197b8e85c74e5910a461078704048d67f82b216508cIhab Awad        public void onConferenceChanged(
198b8e85c74e5910a461078704048d67f82b216508cIhab Awad                RemoteConnection connection,
199b8e85c74e5910a461078704048d67f82b216508cIhab Awad                RemoteConference conference) {}
2006b7f955c2d9b231660b8c54f8ef8e8e6ad802625Santos Cordon
2016b7f955c2d9b231660b8c54f8ef8e8e6ad802625Santos Cordon        /**
2026b7f955c2d9b231660b8c54f8ef8e8e6ad802625Santos Cordon         * Handles changes to the {@code RemoteConference} extras.
2036b7f955c2d9b231660b8c54f8ef8e8e6ad802625Santos Cordon         *
2046b7f955c2d9b231660b8c54f8ef8e8e6ad802625Santos Cordon         * @param connection The {@code RemoteConnection} invoking this method.
2056b7f955c2d9b231660b8c54f8ef8e8e6ad802625Santos Cordon         * @param extras The extras containing other information associated with the connection.
2066b7f955c2d9b231660b8c54f8ef8e8e6ad802625Santos Cordon         */
2076b7f955c2d9b231660b8c54f8ef8e8e6ad802625Santos Cordon        public void onExtrasChanged(RemoteConnection connection, @Nullable Bundle extras) {}
208bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton    }
209bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton
210a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad    public static class VideoProvider {
211a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad
212a2df92512b79e55a3b7c118eeb9ae60628f43c7aTyler Gunn        public abstract static class Callback {
213a2df92512b79e55a3b7c118eeb9ae60628f43c7aTyler Gunn            public void onSessionModifyRequestReceived(
214a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad                    VideoProvider videoProvider,
215a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad                    VideoProfile videoProfile) {}
216a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad
217a2df92512b79e55a3b7c118eeb9ae60628f43c7aTyler Gunn            public void onSessionModifyResponseReceived(
218a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad                    VideoProvider videoProvider,
219a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad                    int status,
220a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad                    VideoProfile requestedProfile,
221a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad                    VideoProfile responseProfile) {}
222a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad
223a2df92512b79e55a3b7c118eeb9ae60628f43c7aTyler Gunn            public void onCallSessionEvent(VideoProvider videoProvider, int event) {}
224a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad
225a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad            public void onPeerDimensionsChanged(VideoProvider videoProvider, int width, int height) {}
226a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad
22707366813cdf3768dcd69a1f744023747564d654aRekha Kumar            public void onCallDataUsageChanged(VideoProvider videoProvider, long dataUsage) {}
228a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad
229a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad            public void onCameraCapabilitiesChanged(
230a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad                    VideoProvider videoProvider,
231400470fab932fe3374149ab89386e460ea161002Yorke Lee                    VideoProfile.CameraCapabilities cameraCapabilities) {}
23207366813cdf3768dcd69a1f744023747564d654aRekha Kumar
23307366813cdf3768dcd69a1f744023747564d654aRekha Kumar            public void onVideoQualityChanged(VideoProvider videoProvider, int videoQuality) {}
234a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad        }
235a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad
236a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad        private final IVideoCallback mVideoCallbackDelegate = new IVideoCallback() {
237a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad            @Override
238a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad            public void receiveSessionModifyRequest(VideoProfile videoProfile) {
239a2df92512b79e55a3b7c118eeb9ae60628f43c7aTyler Gunn                for (Callback l : mCallbacks) {
240a2df92512b79e55a3b7c118eeb9ae60628f43c7aTyler Gunn                    l.onSessionModifyRequestReceived(VideoProvider.this, videoProfile);
241a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad                }
242a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad            }
243a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad
244a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad            @Override
245a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad            public void receiveSessionModifyResponse(int status, VideoProfile requestedProfile,
246a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad                    VideoProfile responseProfile) {
247a2df92512b79e55a3b7c118eeb9ae60628f43c7aTyler Gunn                for (Callback l : mCallbacks) {
248a2df92512b79e55a3b7c118eeb9ae60628f43c7aTyler Gunn                    l.onSessionModifyResponseReceived(
249a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad                            VideoProvider.this,
250a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad                            status,
251a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad                            requestedProfile,
252a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad                            responseProfile);
253a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad                }
254a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad            }
255a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad
256a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad            @Override
257a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad            public void handleCallSessionEvent(int event) {
258a2df92512b79e55a3b7c118eeb9ae60628f43c7aTyler Gunn                for (Callback l : mCallbacks) {
259a2df92512b79e55a3b7c118eeb9ae60628f43c7aTyler Gunn                    l.onCallSessionEvent(VideoProvider.this, event);
260a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad                }
261a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad            }
262a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad
263a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad            @Override
264a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad            public void changePeerDimensions(int width, int height) {
265a2df92512b79e55a3b7c118eeb9ae60628f43c7aTyler Gunn                for (Callback l : mCallbacks) {
266a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad                    l.onPeerDimensionsChanged(VideoProvider.this, width, height);
267a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad                }
268a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad            }
269a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad
270a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad            @Override
27107366813cdf3768dcd69a1f744023747564d654aRekha Kumar            public void changeCallDataUsage(long dataUsage) {
272a2df92512b79e55a3b7c118eeb9ae60628f43c7aTyler Gunn                for (Callback l : mCallbacks) {
273a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad                    l.onCallDataUsageChanged(VideoProvider.this, dataUsage);
274a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad                }
275a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad            }
276a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad
277a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad            @Override
278400470fab932fe3374149ab89386e460ea161002Yorke Lee            public void changeCameraCapabilities(
279400470fab932fe3374149ab89386e460ea161002Yorke Lee                    VideoProfile.CameraCapabilities cameraCapabilities) {
280a2df92512b79e55a3b7c118eeb9ae60628f43c7aTyler Gunn                for (Callback l : mCallbacks) {
281a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad                    l.onCameraCapabilitiesChanged(VideoProvider.this, cameraCapabilities);
282a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad                }
283a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad            }
284a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad
285a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad            @Override
28607366813cdf3768dcd69a1f744023747564d654aRekha Kumar            public void changeVideoQuality(int videoQuality) {
287a2df92512b79e55a3b7c118eeb9ae60628f43c7aTyler Gunn                for (Callback l : mCallbacks) {
28807366813cdf3768dcd69a1f744023747564d654aRekha Kumar                    l.onVideoQualityChanged(VideoProvider.this, videoQuality);
28907366813cdf3768dcd69a1f744023747564d654aRekha Kumar                }
29007366813cdf3768dcd69a1f744023747564d654aRekha Kumar            }
29107366813cdf3768dcd69a1f744023747564d654aRekha Kumar
29207366813cdf3768dcd69a1f744023747564d654aRekha Kumar            @Override
293a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad            public IBinder asBinder() {
294a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad                return null;
295a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad            }
296a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad        };
297a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad
298a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad        private final VideoCallbackServant mVideoCallbackServant =
299a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad                new VideoCallbackServant(mVideoCallbackDelegate);
300a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad
301a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad        private final IVideoProvider mVideoProviderBinder;
302a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad
303a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad        /**
304a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad         * ConcurrentHashMap constructor params: 8 is initial table size, 0.9f is
305a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad         * load factor before resizing, 1 means we only expect a single thread to
306a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad         * access the map so make only a single shard
307a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad         */
308a2df92512b79e55a3b7c118eeb9ae60628f43c7aTyler Gunn        private final Set<Callback> mCallbacks = Collections.newSetFromMap(
309a2df92512b79e55a3b7c118eeb9ae60628f43c7aTyler Gunn                new ConcurrentHashMap<Callback, Boolean>(8, 0.9f, 1));
310a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad
311a2df92512b79e55a3b7c118eeb9ae60628f43c7aTyler Gunn        VideoProvider(IVideoProvider videoProviderBinder) {
312a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad            mVideoProviderBinder = videoProviderBinder;
313a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad            try {
31475958420f2d294ceda517c2782b294002dc2969fTyler Gunn                mVideoProviderBinder.addVideoCallback(mVideoCallbackServant.getStub().asBinder());
315a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad            } catch (RemoteException e) {
316a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad            }
317a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad        }
318a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad
319a2df92512b79e55a3b7c118eeb9ae60628f43c7aTyler Gunn        public void registerCallback(Callback l) {
320a2df92512b79e55a3b7c118eeb9ae60628f43c7aTyler Gunn            mCallbacks.add(l);
321a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad        }
322a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad
323a2df92512b79e55a3b7c118eeb9ae60628f43c7aTyler Gunn        public void unregisterCallback(Callback l) {
324a2df92512b79e55a3b7c118eeb9ae60628f43c7aTyler Gunn            mCallbacks.remove(l);
325a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad        }
326a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad
327a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad        public void setCamera(String cameraId) {
328a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad            try {
329a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad                mVideoProviderBinder.setCamera(cameraId);
330a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad            } catch (RemoteException e) {
331a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad            }
332a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad        }
333a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad
334a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad        public void setPreviewSurface(Surface surface) {
335a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad            try {
336a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad                mVideoProviderBinder.setPreviewSurface(surface);
337a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad            } catch (RemoteException e) {
338a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad            }
339a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad        }
340a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad
341a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad        public void setDisplaySurface(Surface surface) {
342a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad            try {
343a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad                mVideoProviderBinder.setDisplaySurface(surface);
344a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad            } catch (RemoteException e) {
345a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad            }
346a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad        }
347a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad
348a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad        public void setDeviceOrientation(int rotation) {
349a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad            try {
350a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad                mVideoProviderBinder.setDeviceOrientation(rotation);
351a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad            } catch (RemoteException e) {
352a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad            }
353a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad        }
354a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad
355a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad        public void setZoom(float value) {
356a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad            try {
357a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad                mVideoProviderBinder.setZoom(value);
358a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad            } catch (RemoteException e) {
359a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad            }
360a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad        }
361a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad
3624538216a31d15b01e18c7b504e51031da0ce6e40Tyler Gunn        public void sendSessionModifyRequest(VideoProfile fromProfile, VideoProfile toProfile) {
363a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad            try {
3644538216a31d15b01e18c7b504e51031da0ce6e40Tyler Gunn                mVideoProviderBinder.sendSessionModifyRequest(fromProfile, toProfile);
365a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad            } catch (RemoteException e) {
366a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad            }
367a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad        }
368a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad
369a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad        public void sendSessionModifyResponse(VideoProfile responseProfile) {
370a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad            try {
371a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad                mVideoProviderBinder.sendSessionModifyResponse(responseProfile);
372a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad            } catch (RemoteException e) {
373a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad            }
374a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad        }
375a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad
376a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad        public void requestCameraCapabilities() {
377a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad            try {
378a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad                mVideoProviderBinder.requestCameraCapabilities();
379a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad            } catch (RemoteException e) {
380a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad            }
381a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad        }
382a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad
383a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad        public void requestCallDataUsage() {
384a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad            try {
385a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad                mVideoProviderBinder.requestCallDataUsage();
386a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad            } catch (RemoteException e) {
387a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad            }
388a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad        }
389a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad
39032f24731604fd81289a39619bbc925b65184b505Yorke Lee        public void setPauseImage(Uri uri) {
391a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad            try {
392a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad                mVideoProviderBinder.setPauseImage(uri);
393a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad            } catch (RemoteException e) {
394a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad            }
395a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad        }
396a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad    }
397a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad
398bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton    private IConnectionService mConnectionService;
39952d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon    private final String mConnectionId;
400229e3820dce98f64fd4834d5f421faec9a9d7026Jay Shrauner    /**
401229e3820dce98f64fd4834d5f421faec9a9d7026Jay Shrauner     * ConcurrentHashMap constructor params: 8 is initial table size, 0.9f is
402229e3820dce98f64fd4834d5f421faec9a9d7026Jay Shrauner     * load factor before resizing, 1 means we only expect a single thread to
403229e3820dce98f64fd4834d5f421faec9a9d7026Jay Shrauner     * access the map so make only a single shard
404229e3820dce98f64fd4834d5f421faec9a9d7026Jay Shrauner     */
405011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee    private final Set<CallbackRecord> mCallbackRecords = Collections.newSetFromMap(
406011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee            new ConcurrentHashMap<CallbackRecord, Boolean>(8, 0.9f, 1));
407b8e85c74e5910a461078704048d67f82b216508cIhab Awad    private final List<RemoteConnection> mConferenceableConnections = new ArrayList<>();
408b8e85c74e5910a461078704048d67f82b216508cIhab Awad    private final List<RemoteConnection> mUnmodifiableconferenceableConnections =
409b8e85c74e5910a461078704048d67f82b216508cIhab Awad            Collections.unmodifiableList(mConferenceableConnections);
41052d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon
411b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad    private int mState = Connection.STATE_NEW;
4127f3d41fd124dd7c4a8b72c1d48df08a8ee7209ecAndrew Lee    private DisconnectCause mDisconnectCause;
413100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee    private boolean mRingbackRequested;
41452d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon    private boolean mConnected;
4155c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad    private int mConnectionCapabilities;
416aa07df84f279a87ad6370758c9d792a660f2cebbTyler Gunn    private int mVideoState;
417a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad    private VideoProvider mVideoProvider;
418100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee    private boolean mIsVoipAudioMode;
419e7ef59a77d55c9802cc7d919f7dd794bd5fea30eSailesh Nepal    private StatusHints mStatusHints;
420100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee    private Uri mAddress;
421100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee    private int mAddressPresentation;
422612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepal    private String mCallerDisplayName;
423612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepal    private int mCallerDisplayNamePresentation;
424b8e85c74e5910a461078704048d67f82b216508cIhab Awad    private RemoteConference mConference;
4256b7f955c2d9b231660b8c54f8ef8e8e6ad802625Santos Cordon    private Bundle mExtras;
42652d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon
42752d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon    /**
42852d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon     * @hide
42952d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon     */
430b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad    RemoteConnection(
431b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            String id,
432b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            IConnectionService connectionService,
433b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            ConnectionRequest request) {
434b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        mConnectionId = id;
4352a46b90222e5c9c73de012382a604a71f9c0c30cSailesh Nepal        mConnectionService = connectionService;
43652d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon        mConnected = true;
437b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        mState = Connection.STATE_INITIALIZING;
438bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton    }
439bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton
440bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton    /**
4414a57b9b59b74c97e559a301af0add13cd4c3331cTyler Gunn     * @hide
4424a57b9b59b74c97e559a301af0add13cd4c3331cTyler Gunn     */
4434a57b9b59b74c97e559a301af0add13cd4c3331cTyler Gunn    RemoteConnection(String callId, IConnectionService connectionService,
4444a57b9b59b74c97e559a301af0add13cd4c3331cTyler Gunn            ParcelableConnection connection) {
4454a57b9b59b74c97e559a301af0add13cd4c3331cTyler Gunn        mConnectionId = callId;
4464a57b9b59b74c97e559a301af0add13cd4c3331cTyler Gunn        mConnectionService = connectionService;
4474a57b9b59b74c97e559a301af0add13cd4c3331cTyler Gunn        mConnected = true;
4484a57b9b59b74c97e559a301af0add13cd4c3331cTyler Gunn        mState = connection.getState();
4494a57b9b59b74c97e559a301af0add13cd4c3331cTyler Gunn        mDisconnectCause = connection.getDisconnectCause();
4504a57b9b59b74c97e559a301af0add13cd4c3331cTyler Gunn        mRingbackRequested = connection.isRingbackRequested();
4515c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        mConnectionCapabilities = connection.getConnectionCapabilities();
4524a57b9b59b74c97e559a301af0add13cd4c3331cTyler Gunn        mVideoState = connection.getVideoState();
4534a57b9b59b74c97e559a301af0add13cd4c3331cTyler Gunn        mVideoProvider = new RemoteConnection.VideoProvider(connection.getVideoProvider());
4544a57b9b59b74c97e559a301af0add13cd4c3331cTyler Gunn        mIsVoipAudioMode = connection.getIsVoipAudioMode();
4554a57b9b59b74c97e559a301af0add13cd4c3331cTyler Gunn        mStatusHints = connection.getStatusHints();
4564a57b9b59b74c97e559a301af0add13cd4c3331cTyler Gunn        mAddress = connection.getHandle();
4574a57b9b59b74c97e559a301af0add13cd4c3331cTyler Gunn        mAddressPresentation = connection.getHandlePresentation();
4584a57b9b59b74c97e559a301af0add13cd4c3331cTyler Gunn        mCallerDisplayName = connection.getCallerDisplayName();
4594a57b9b59b74c97e559a301af0add13cd4c3331cTyler Gunn        mCallerDisplayNamePresentation = connection.getCallerDisplayNamePresentation();
4604a57b9b59b74c97e559a301af0add13cd4c3331cTyler Gunn        mConference = null;
4614a57b9b59b74c97e559a301af0add13cd4c3331cTyler Gunn    }
4624a57b9b59b74c97e559a301af0add13cd4c3331cTyler Gunn
4634a57b9b59b74c97e559a301af0add13cd4c3331cTyler Gunn    /**
464bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton     * Create a RemoteConnection which is used for failed connections. Note that using it for any
465bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton     * "real" purpose will almost certainly fail. Callers should note the failure and act
466bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton     * accordingly (moving on to another RemoteConnection, for example)
467bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton     *
4687f3d41fd124dd7c4a8b72c1d48df08a8ee7209ecAndrew Lee     * @param disconnectCause The reason for the failed connection.
4697f3d41fd124dd7c4a8b72c1d48df08a8ee7209ecAndrew Lee     * @hide
470bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton     */
4717f3d41fd124dd7c4a8b72c1d48df08a8ee7209ecAndrew Lee    RemoteConnection(DisconnectCause disconnectCause) {
4724a57b9b59b74c97e559a301af0add13cd4c3331cTyler Gunn        mConnectionId = "NULL";
473bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton        mConnected = false;
4746107bab041fb7d851fbf865b7310d294aae970c8Ihab Awad        mState = Connection.STATE_DISCONNECTED;
4757f3d41fd124dd7c4a8b72c1d48df08a8ee7209ecAndrew Lee        mDisconnectCause = disconnectCause;
47652d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon    }
47752d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon
4785d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad    /**
479100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee     * Adds a callback to this {@code RemoteConnection}.
4805d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad     *
481100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee     * @param callback A {@code Callback}.
4825d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad     */
483100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee    public void registerCallback(Callback callback) {
484011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee        registerCallback(callback, new Handler());
485011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee    }
486011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee
487011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee    /**
488011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee     * Adds a callback to this {@code RemoteConnection}.
489011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee     *
490011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee     * @param callback A {@code Callback}.
491011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee     * @param handler A {@code Handler} which command and status changes will be delivered to.
492011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee     */
493011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee    public void registerCallback(Callback callback, Handler handler) {
494011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee        unregisterCallback(callback);
495011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee        if (callback != null && handler != null) {
496011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee            mCallbackRecords.add(new CallbackRecord(callback, handler));
497011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee        }
49852d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon    }
49952d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon
5005d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad    /**
501100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee     * Removes a callback from this {@code RemoteConnection}.
5025d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad     *
503100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee     * @param callback A {@code Callback}.
5045d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad     */
505100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee    public void unregisterCallback(Callback callback) {
506100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee        if (callback != null) {
507011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee            for (CallbackRecord record : mCallbackRecords) {
508011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee                if (record.getCallback() == callback) {
509011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee                    mCallbackRecords.remove(record);
510011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee                    break;
511011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee                }
512011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee            }
513229e3820dce98f64fd4834d5f421faec9a9d7026Jay Shrauner        }
51452d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon    }
51552d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon
5165d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad    /**
5175d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad     * Obtains the state of this {@code RemoteConnection}.
5185d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad     *
5195d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad     * @return A state value, chosen from the {@code STATE_*} constants.
5205d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad     */
521ade3f25a488fc3c1243db8c88554771e571beeb1Sailesh Nepal    public int getState() {
522ade3f25a488fc3c1243db8c88554771e571beeb1Sailesh Nepal        return mState;
523ade3f25a488fc3c1243db8c88554771e571beeb1Sailesh Nepal    }
524ade3f25a488fc3c1243db8c88554771e571beeb1Sailesh Nepal
5255d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad    /**
5265c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * Obtains the reason why this {@code RemoteConnection} may have been disconnected.
5275c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     *
528b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad     * @return For a {@link Connection#STATE_DISCONNECTED} {@code RemoteConnection}, the
5295c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     *         disconnect cause expressed as a code chosen from among those declared in
5305c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     *         {@link DisconnectCause}.
5315d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad     */
5327f3d41fd124dd7c4a8b72c1d48df08a8ee7209ecAndrew Lee    public DisconnectCause getDisconnectCause() {
5337f3d41fd124dd7c4a8b72c1d48df08a8ee7209ecAndrew Lee        return mDisconnectCause;
53452d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon    }
53552d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon
5365d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad    /**
5375c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * Obtains the capabilities of this {@code RemoteConnection}.
5385c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     *
5395d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad     * @return A bitmask of the capabilities of the {@code RemoteConnection}, as defined in
5405c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     *         the {@code CAPABILITY_*} constants in class {@link Connection}.
5415d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad     */
5425c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad    public int getConnectionCapabilities() {
5435c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        return mConnectionCapabilities;
5441a7061ba950538c93d92c0448752a212039cc06aSailesh Nepal    }
5451a7061ba950538c93d92c0448752a212039cc06aSailesh Nepal
5465d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad    /**
5475c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * Determines if the audio mode of this {@code RemoteConnection} is VOIP.
5485c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     *
5495d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad     * @return {@code true} if the {@code RemoteConnection}'s current audio mode is VOIP.
5505d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad     */
551100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee    public boolean isVoipAudioMode() {
552100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee        return mIsVoipAudioMode;
55333aaae4a07fdcce223fe74d96d751f4bffa6723aSailesh Nepal    }
55433aaae4a07fdcce223fe74d96d751f4bffa6723aSailesh Nepal
5555d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad    /**
5565c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * Obtains status hints pertaining to this {@code RemoteConnection}.
5575c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     *
558b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad     * @return The current {@link StatusHints} of this {@code RemoteConnection},
5595c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     *         or {@code null} if none have been set.
5605d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad     */
561e7ef59a77d55c9802cc7d919f7dd794bd5fea30eSailesh Nepal    public StatusHints getStatusHints() {
562e7ef59a77d55c9802cc7d919f7dd794bd5fea30eSailesh Nepal        return mStatusHints;
563e7ef59a77d55c9802cc7d919f7dd794bd5fea30eSailesh Nepal    }
564e7ef59a77d55c9802cc7d919f7dd794bd5fea30eSailesh Nepal
5655d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad    /**
5665c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * Obtains the address of this {@code RemoteConnection}.
5675c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     *
5685c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * @return The address (e.g., phone number) to which the {@code RemoteConnection}
5695c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     *         is currently connected.
5705d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad     */
571100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee    public Uri getAddress() {
572100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee        return mAddress;
573612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepal    }
574612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepal
5755d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad    /**
5765c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * Obtains the presentation requirements for the address of this {@code RemoteConnection}.
5775c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     *
5785c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * @return The presentation requirements for the address. See
5795c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     *         {@link TelecomManager} for valid values.
5805d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad     */
581100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee    public int getAddressPresentation() {
582100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee        return mAddressPresentation;
583612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepal    }
584612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepal
5855d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad    /**
5865c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * Obtains the display name for this {@code RemoteConnection}'s caller.
5875c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     *
5885d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad     * @return The display name for the caller.
5895d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad     */
590100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee    public CharSequence getCallerDisplayName() {
591612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepal        return mCallerDisplayName;
592612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepal    }
593612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepal
5945d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad    /**
5955c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * Obtains the presentation requirements for this {@code RemoteConnection}'s
5965c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * caller's display name.
5975c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     *
5985d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad     * @return The presentation requirements for the caller display name. See
5995c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     *         {@link TelecomManager} for valid values.
6005d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad     */
601612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepal    public int getCallerDisplayNamePresentation() {
602612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepal        return mCallerDisplayNamePresentation;
603612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepal    }
604612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepal
6055d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad    /**
6065c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * Obtains the video state of this {@code RemoteConnection}.
6075c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     *
60887b73f370e2b8a76b0540580f43edba6ec21c6cfTyler Gunn     * @return The video state of the {@code RemoteConnection}. See {@link VideoProfile}.
6095d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad     */
610aa07df84f279a87ad6370758c9d792a660f2cebbTyler Gunn    public int getVideoState() {
611aa07df84f279a87ad6370758c9d792a660f2cebbTyler Gunn        return mVideoState;
612aa07df84f279a87ad6370758c9d792a660f2cebbTyler Gunn    }
613aa07df84f279a87ad6370758c9d792a660f2cebbTyler Gunn
6145d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad    /**
61507366813cdf3768dcd69a1f744023747564d654aRekha Kumar     * Obtains the video provider of this {@code RemoteConnection}.
616a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad     * @return The video provider associated with this {@code RemoteConnection}.
617a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad     */
618a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad    public final VideoProvider getVideoProvider() {
619a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad        return mVideoProvider;
620a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad    }
621a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad
622a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad    /**
6236b7f955c2d9b231660b8c54f8ef8e8e6ad802625Santos Cordon     * Obtain the extras associated with this {@code RemoteConnection}.
6246b7f955c2d9b231660b8c54f8ef8e8e6ad802625Santos Cordon     *
6256b7f955c2d9b231660b8c54f8ef8e8e6ad802625Santos Cordon     * @return The extras for this connection.
6266b7f955c2d9b231660b8c54f8ef8e8e6ad802625Santos Cordon     */
6276b7f955c2d9b231660b8c54f8ef8e8e6ad802625Santos Cordon    public final Bundle getExtras() {
6286b7f955c2d9b231660b8c54f8ef8e8e6ad802625Santos Cordon        return mExtras;
6296b7f955c2d9b231660b8c54f8ef8e8e6ad802625Santos Cordon    }
6306b7f955c2d9b231660b8c54f8ef8e8e6ad802625Santos Cordon
6316b7f955c2d9b231660b8c54f8ef8e8e6ad802625Santos Cordon    /**
6325c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     * Determines whether this {@code RemoteConnection} is requesting ringback.
6335c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     *
6345d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad     * @return Whether the {@code RemoteConnection} is requesting that the framework play a
6355c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad     *         ringback tone on its behalf.
6365d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad     */
637100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee    public boolean isRingbackRequested() {
63815d63c718f6e7bcec6c1fd47d2d06fd59b9c1aefSantos Cordon        return mRingbackRequested;
6395d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad    }
6405d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad
6415d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad    /**
6425d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad     * Instructs this {@code RemoteConnection} to abort.
6435d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad     */
644091768c3021d740b7d66846d36405c4d4c76cc56Sailesh Nepal    public void abort() {
645091768c3021d740b7d66846d36405c4d4c76cc56Sailesh Nepal        try {
646091768c3021d740b7d66846d36405c4d4c76cc56Sailesh Nepal            if (mConnected) {
6472a46b90222e5c9c73de012382a604a71f9c0c30cSailesh Nepal                mConnectionService.abort(mConnectionId);
648091768c3021d740b7d66846d36405c4d4c76cc56Sailesh Nepal            }
649091768c3021d740b7d66846d36405c4d4c76cc56Sailesh Nepal        } catch (RemoteException ignored) {
650091768c3021d740b7d66846d36405c4d4c76cc56Sailesh Nepal        }
651091768c3021d740b7d66846d36405c4d4c76cc56Sailesh Nepal    }
652091768c3021d740b7d66846d36405c4d4c76cc56Sailesh Nepal
6535d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad    /**
654b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad     * Instructs this {@link Connection#STATE_RINGING} {@code RemoteConnection} to answer.
655be74de0978a7eaa577f6b61902b550a3161aff8bTyler Gunn     */
656be74de0978a7eaa577f6b61902b550a3161aff8bTyler Gunn    public void answer() {
657be74de0978a7eaa577f6b61902b550a3161aff8bTyler Gunn        try {
658be74de0978a7eaa577f6b61902b550a3161aff8bTyler Gunn            if (mConnected) {
659be74de0978a7eaa577f6b61902b550a3161aff8bTyler Gunn                mConnectionService.answer(mConnectionId);
660be74de0978a7eaa577f6b61902b550a3161aff8bTyler Gunn            }
661be74de0978a7eaa577f6b61902b550a3161aff8bTyler Gunn        } catch (RemoteException ignored) {
662be74de0978a7eaa577f6b61902b550a3161aff8bTyler Gunn        }
663be74de0978a7eaa577f6b61902b550a3161aff8bTyler Gunn    }
664be74de0978a7eaa577f6b61902b550a3161aff8bTyler Gunn
665be74de0978a7eaa577f6b61902b550a3161aff8bTyler Gunn    /**
666be74de0978a7eaa577f6b61902b550a3161aff8bTyler Gunn     * Instructs this {@link Connection#STATE_RINGING} {@code RemoteConnection} to answer.
6675d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad     * @param videoState The video state in which to answer the call.
668be74de0978a7eaa577f6b61902b550a3161aff8bTyler Gunn     * @hide
6695d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad     */
6708da4c3c11faf066b2b04ba853f03be6f1c4af5d8Andrew Lee    public void answer(int videoState) {
67152d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon        try {
67252d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon            if (mConnected) {
673be74de0978a7eaa577f6b61902b550a3161aff8bTyler Gunn                mConnectionService.answerVideo(mConnectionId, videoState);
67452d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon            }
67552d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon        } catch (RemoteException ignored) {
67652d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon        }
67752d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon    }
67852d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon
6795d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad    /**
680b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad     * Instructs this {@link Connection#STATE_RINGING} {@code RemoteConnection} to reject.
6815d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad     */
68252d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon    public void reject() {
68352d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon        try {
68452d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon            if (mConnected) {
6852a46b90222e5c9c73de012382a604a71f9c0c30cSailesh Nepal                mConnectionService.reject(mConnectionId);
68652d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon            }
68752d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon        } catch (RemoteException ignored) {
68852d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon        }
68952d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon    }
69052d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon
6915d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad    /**
6925d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad     * Instructs this {@code RemoteConnection} to go on hold.
6935d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad     */
69452d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon    public void hold() {
69552d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon        try {
69652d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon            if (mConnected) {
6972a46b90222e5c9c73de012382a604a71f9c0c30cSailesh Nepal                mConnectionService.hold(mConnectionId);
69852d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon            }
69952d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon        } catch (RemoteException ignored) {
70052d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon        }
70152d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon    }
70252d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon
7035d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad    /**
704b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad     * Instructs this {@link Connection#STATE_HOLDING} call to release from hold.
7055d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad     */
70652d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon    public void unhold() {
70752d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon        try {
70852d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon            if (mConnected) {
7092a46b90222e5c9c73de012382a604a71f9c0c30cSailesh Nepal                mConnectionService.unhold(mConnectionId);
71052d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon            }
71152d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon        } catch (RemoteException ignored) {
71252d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon        }
71352d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon    }
71452d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon
7155d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad    /**
7165d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad     * Instructs this {@code RemoteConnection} to disconnect.
7175d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad     */
71852d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon    public void disconnect() {
71952d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon        try {
72052d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon            if (mConnected) {
7212a46b90222e5c9c73de012382a604a71f9c0c30cSailesh Nepal                mConnectionService.disconnect(mConnectionId);
72252d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon            }
72352d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon        } catch (RemoteException ignored) {
72452d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon        }
72552d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon    }
72652d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon
7275d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad    /**
7285d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad     * Instructs this {@code RemoteConnection} to play a dual-tone multi-frequency signaling
7295d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad     * (DTMF) tone.
7305d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad     *
7315d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad     * Any other currently playing DTMF tone in the specified call is immediately stopped.
7325d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad     *
7335d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad     * @param digit A character representing the DTMF digit for which to play the tone. This
7345d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad     *         value must be one of {@code '0'} through {@code '9'}, {@code '*'} or {@code '#'}.
7355d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad     */
7365d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad    public void playDtmfTone(char digit) {
73752d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon        try {
73852d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon            if (mConnected) {
7392a46b90222e5c9c73de012382a604a71f9c0c30cSailesh Nepal                mConnectionService.playDtmfTone(mConnectionId, digit);
74052d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon            }
74152d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon        } catch (RemoteException ignored) {
74252d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon        }
74352d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon    }
74452d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon
7455d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad    /**
7465d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad     * Instructs this {@code RemoteConnection} to stop any dual-tone multi-frequency signaling
7475d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad     * (DTMF) tone currently playing.
7485d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad     *
7495d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad     * DTMF tones are played by calling {@link #playDtmfTone(char)}. If no DTMF tone is
7505d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad     * currently playing, this method will do nothing.
7515d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad     */
7525d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad    public void stopDtmfTone() {
75352d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon        try {
75452d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon            if (mConnected) {
7552a46b90222e5c9c73de012382a604a71f9c0c30cSailesh Nepal                mConnectionService.stopDtmfTone(mConnectionId);
75652d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon            }
75752d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon        } catch (RemoteException ignored) {
75852d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon        }
75952d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon    }
76052d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon
7615d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad    /**
7625d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad     * Instructs this {@code RemoteConnection} to continue playing a post-dial DTMF string.
7635d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad     *
7645d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad     * A post-dial DTMF string is a string of digits following the first instance of either
765ef9f6f957d897ea0ed82114185b8fa3fefd4917bTyler Gunn     * {@link TelecomManager#DTMF_CHARACTER_WAIT} or {@link TelecomManager#DTMF_CHARACTER_PAUSE}.
7665d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad     * These digits are immediately sent as DTMF tones to the recipient as soon as the
7675d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad     * connection is made.
7685d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad     *
769ef9f6f957d897ea0ed82114185b8fa3fefd4917bTyler Gunn     * If the DTMF string contains a {@link TelecomManager#DTMF_CHARACTER_PAUSE} symbol, this
7705d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad     * {@code RemoteConnection} will temporarily pause playing the tones for a pre-defined period
7715d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad     * of time.
7725d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad     *
773ef9f6f957d897ea0ed82114185b8fa3fefd4917bTyler Gunn     * If the DTMF string contains a {@link TelecomManager#DTMF_CHARACTER_WAIT} symbol, this
77427d1c2d148fe377ca0d2744f0f85789a42c8f808Nancy Chen     * {@code RemoteConnection} will pause playing the tones and notify callbacks via
775100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee     * {@link Callback#onPostDialWait(RemoteConnection, String)}. At this point, the in-call app
7765d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad     * should display to the user an indication of this state and an affordance to continue
7775d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad     * the postdial sequence. When the user decides to continue the postdial sequence, the in-call
7785d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad     * app should invoke the {@link #postDialContinue(boolean)} method.
7795d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad     *
7805d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad     * @param proceed Whether or not to continue with the post-dial sequence.
7815d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad     */
78252d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon    public void postDialContinue(boolean proceed) {
78352d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon        try {
78452d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon            if (mConnected) {
7852a46b90222e5c9c73de012382a604a71f9c0c30cSailesh Nepal                mConnectionService.onPostDialContinue(mConnectionId, proceed);
78652d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon            }
78752d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon        } catch (RemoteException ignored) {
78852d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon        }
78952d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon    }
79052d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon
7915d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad    /**
7925d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad     * Set the audio state of this {@code RemoteConnection}.
7935d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad     *
7945d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad     * @param state The audio state of this {@code RemoteConnection}.
7954af5935c71f1e31ef1aec27661c4ef60545a0924Yorke Lee     * @hide
7964af5935c71f1e31ef1aec27661c4ef60545a0924Yorke Lee     * @deprecated Use {@link #setCallAudioState(CallAudioState) instead.
7975d0410fa7c2dead7906780551ba4aa0305021cefIhab Awad     */
7984af5935c71f1e31ef1aec27661c4ef60545a0924Yorke Lee    @SystemApi
7994af5935c71f1e31ef1aec27661c4ef60545a0924Yorke Lee    @Deprecated
800b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad    public void setAudioState(AudioState state) {
8014af5935c71f1e31ef1aec27661c4ef60545a0924Yorke Lee        setCallAudioState(new CallAudioState(state));
8024af5935c71f1e31ef1aec27661c4ef60545a0924Yorke Lee    }
8034af5935c71f1e31ef1aec27661c4ef60545a0924Yorke Lee
8044af5935c71f1e31ef1aec27661c4ef60545a0924Yorke Lee    /**
8054af5935c71f1e31ef1aec27661c4ef60545a0924Yorke Lee     * Set the audio state of this {@code RemoteConnection}.
8064af5935c71f1e31ef1aec27661c4ef60545a0924Yorke Lee     *
8074af5935c71f1e31ef1aec27661c4ef60545a0924Yorke Lee     * @param state The audio state of this {@code RemoteConnection}.
8084af5935c71f1e31ef1aec27661c4ef60545a0924Yorke Lee     */
8094af5935c71f1e31ef1aec27661c4ef60545a0924Yorke Lee    public void setCallAudioState(CallAudioState state) {
810091768c3021d740b7d66846d36405c4d4c76cc56Sailesh Nepal        try {
811091768c3021d740b7d66846d36405c4d4c76cc56Sailesh Nepal            if (mConnected) {
8124af5935c71f1e31ef1aec27661c4ef60545a0924Yorke Lee                mConnectionService.onCallAudioStateChanged(mConnectionId, state);
813091768c3021d740b7d66846d36405c4d4c76cc56Sailesh Nepal            }
814091768c3021d740b7d66846d36405c4d4c76cc56Sailesh Nepal        } catch (RemoteException ignored) {
815091768c3021d740b7d66846d36405c4d4c76cc56Sailesh Nepal        }
816091768c3021d740b7d66846d36405c4d4c76cc56Sailesh Nepal    }
817091768c3021d740b7d66846d36405c4d4c76cc56Sailesh Nepal
81852d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon    /**
819b8e85c74e5910a461078704048d67f82b216508cIhab Awad     * Obtain the {@code RemoteConnection}s with which this {@code RemoteConnection} may be
820b8e85c74e5910a461078704048d67f82b216508cIhab Awad     * successfully asked to create a conference with.
821b8e85c74e5910a461078704048d67f82b216508cIhab Awad     *
822b8e85c74e5910a461078704048d67f82b216508cIhab Awad     * @return The {@code RemoteConnection}s with which this {@code RemoteConnection} may be
823b8e85c74e5910a461078704048d67f82b216508cIhab Awad     *         merged into a {@link RemoteConference}.
824b8e85c74e5910a461078704048d67f82b216508cIhab Awad     */
825b8e85c74e5910a461078704048d67f82b216508cIhab Awad    public List<RemoteConnection> getConferenceableConnections() {
826b8e85c74e5910a461078704048d67f82b216508cIhab Awad        return mUnmodifiableconferenceableConnections;
827b8e85c74e5910a461078704048d67f82b216508cIhab Awad    }
828b8e85c74e5910a461078704048d67f82b216508cIhab Awad
829b8e85c74e5910a461078704048d67f82b216508cIhab Awad    /**
830b8e85c74e5910a461078704048d67f82b216508cIhab Awad     * Obtain the {@code RemoteConference} that this {@code RemoteConnection} may be a part
831b8e85c74e5910a461078704048d67f82b216508cIhab Awad     * of, or {@code null} if there is no such {@code RemoteConference}.
832b8e85c74e5910a461078704048d67f82b216508cIhab Awad     *
833b8e85c74e5910a461078704048d67f82b216508cIhab Awad     * @return A {@code RemoteConference} or {@code null};
834b8e85c74e5910a461078704048d67f82b216508cIhab Awad     */
835b8e85c74e5910a461078704048d67f82b216508cIhab Awad    public RemoteConference getConference() {
836b8e85c74e5910a461078704048d67f82b216508cIhab Awad        return mConference;
837b8e85c74e5910a461078704048d67f82b216508cIhab Awad    }
838b8e85c74e5910a461078704048d67f82b216508cIhab Awad
839b8e85c74e5910a461078704048d67f82b216508cIhab Awad    /** {@hide} */
840b8e85c74e5910a461078704048d67f82b216508cIhab Awad    String getId() {
841b8e85c74e5910a461078704048d67f82b216508cIhab Awad        return mConnectionId;
842b8e85c74e5910a461078704048d67f82b216508cIhab Awad    }
843b8e85c74e5910a461078704048d67f82b216508cIhab Awad
844b8e85c74e5910a461078704048d67f82b216508cIhab Awad    /** {@hide} */
845b8e85c74e5910a461078704048d67f82b216508cIhab Awad    IConnectionService getConnectionService() {
846b8e85c74e5910a461078704048d67f82b216508cIhab Awad        return mConnectionService;
847b8e85c74e5910a461078704048d67f82b216508cIhab Awad    }
848b8e85c74e5910a461078704048d67f82b216508cIhab Awad
849b8e85c74e5910a461078704048d67f82b216508cIhab Awad    /**
85052d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon     * @hide
85152d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon     */
852011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee    void setState(final int state) {
85352d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon        if (mState != state) {
85452d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon            mState = state;
855011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee            for (CallbackRecord record: mCallbackRecords) {
856011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee                final RemoteConnection connection = this;
857011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee                final Callback callback = record.getCallback();
858011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee                record.getHandler().post(new Runnable() {
859011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee                    @Override
860011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee                    public void run() {
861011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee                        callback.onStateChanged(connection, state);
862011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee                    }
863011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee                });
86452d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon            }
86552d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon        }
86652d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon    }
86752d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon
86852d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon    /**
86952d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon     * @hide
87052d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon     */
871011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee    void setDisconnected(final DisconnectCause disconnectCause) {
872b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        if (mState != Connection.STATE_DISCONNECTED) {
873b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            mState = Connection.STATE_DISCONNECTED;
8747f3d41fd124dd7c4a8b72c1d48df08a8ee7209ecAndrew Lee            mDisconnectCause = disconnectCause;
87552d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon
876011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee            for (CallbackRecord record : mCallbackRecords) {
877011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee                final RemoteConnection connection = this;
878011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee                final Callback callback = record.getCallback();
879011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee                record.getHandler().post(new Runnable() {
880011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee                    @Override
881011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee                    public void run() {
882011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee                        callback.onDisconnected(connection, disconnectCause);
883011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee                    }
884011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee                });
88552d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon            }
88652d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon        }
88752d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon    }
88852d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon
88952d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon    /**
89052d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon     * @hide
89152d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon     */
892011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee    void setRingbackRequested(final boolean ringback) {
893100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee        if (mRingbackRequested != ringback) {
894100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee            mRingbackRequested = ringback;
895011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee            for (CallbackRecord record : mCallbackRecords) {
896011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee                final RemoteConnection connection = this;
897011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee                final Callback callback = record.getCallback();
898011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee                record.getHandler().post(new Runnable() {
899011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee                    @Override
900011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee                    public void run() {
901011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee                        callback.onRingbackRequested(connection, ringback);
902011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee                    }
903011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee                });
90452d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon            }
90552d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon        }
90652d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon    }
90752d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon
90852d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon    /**
90952d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon     * @hide
91052d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon     */
911011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee    void setConnectionCapabilities(final int connectionCapabilities) {
9125c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad        mConnectionCapabilities = connectionCapabilities;
913011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee        for (CallbackRecord record : mCallbackRecords) {
914011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee            final RemoteConnection connection = this;
915011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee            final Callback callback = record.getCallback();
916011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee            record.getHandler().post(new Runnable() {
917011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee                @Override
918011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee                public void run() {
919011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee                    callback.onConnectionCapabilitiesChanged(connection, connectionCapabilities);
920011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee                }
921011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee            });
9221a7061ba950538c93d92c0448752a212039cc06aSailesh Nepal        }
9231a7061ba950538c93d92c0448752a212039cc06aSailesh Nepal    }
9241a7061ba950538c93d92c0448752a212039cc06aSailesh Nepal
9251a7061ba950538c93d92c0448752a212039cc06aSailesh Nepal    /**
9261a7061ba950538c93d92c0448752a212039cc06aSailesh Nepal     * @hide
9271a7061ba950538c93d92c0448752a212039cc06aSailesh Nepal     */
92852d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon    void setDestroyed() {
929011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee        if (!mCallbackRecords.isEmpty()) {
930100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee            // Make sure that the callbacks are notified that the call is destroyed first.
931b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            if (mState != Connection.STATE_DISCONNECTED) {
9327f3d41fd124dd7c4a8b72c1d48df08a8ee7209ecAndrew Lee                setDisconnected(
9337f3d41fd124dd7c4a8b72c1d48df08a8ee7209ecAndrew Lee                        new DisconnectCause(DisconnectCause.ERROR, "Connection destroyed."));
93452d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon            }
93552d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon
936011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee            for (CallbackRecord record : mCallbackRecords) {
937011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee                final RemoteConnection connection = this;
938011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee                final Callback callback = record.getCallback();
939011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee                record.getHandler().post(new Runnable() {
940011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee                    @Override
941011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee                    public void run() {
942011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee                        callback.onDestroyed(connection);
943011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee                    }
944011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee                });
94552d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon            }
946011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee            mCallbackRecords.clear();
94752d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon
94852d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon            mConnected = false;
94952d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon        }
95052d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon    }
95152d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon
95252d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon    /**
95352d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon     * @hide
95452d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon     */
955011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee    void setPostDialWait(final String remainingDigits) {
956011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee        for (CallbackRecord record : mCallbackRecords) {
957011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee            final RemoteConnection connection = this;
958011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee            final Callback callback = record.getCallback();
959011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee            record.getHandler().post(new Runnable() {
960011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee                @Override
961011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee                public void run() {
962011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee                    callback.onPostDialWait(connection, remainingDigits);
963011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee                }
964011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee            });
96552d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon        }
966aa07df84f279a87ad6370758c9d792a660f2cebbTyler Gunn    }
967aa07df84f279a87ad6370758c9d792a660f2cebbTyler Gunn
968aa07df84f279a87ad6370758c9d792a660f2cebbTyler Gunn    /**
969aa07df84f279a87ad6370758c9d792a660f2cebbTyler Gunn     * @hide
970aa07df84f279a87ad6370758c9d792a660f2cebbTyler Gunn     */
971011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee    void onPostDialChar(final char nextChar) {
972011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee        for (CallbackRecord record : mCallbackRecords) {
973011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee            final RemoteConnection connection = this;
974011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee            final Callback callback = record.getCallback();
975011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee            record.getHandler().post(new Runnable() {
976011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee                @Override
977011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee                public void run() {
97840451b3977f51bd0726b645f73167869f71d4e4cSailesh Nepal                    callback.onPostDialChar(connection, nextChar);
979011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee                }
980011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee            });
98127d1c2d148fe377ca0d2744f0f85789a42c8f808Nancy Chen        }
98227d1c2d148fe377ca0d2744f0f85789a42c8f808Nancy Chen    }
98327d1c2d148fe377ca0d2744f0f85789a42c8f808Nancy Chen
98427d1c2d148fe377ca0d2744f0f85789a42c8f808Nancy Chen    /**
98527d1c2d148fe377ca0d2744f0f85789a42c8f808Nancy Chen     * @hide
98627d1c2d148fe377ca0d2744f0f85789a42c8f808Nancy Chen     */
987011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee    void setVideoState(final int videoState) {
988aa07df84f279a87ad6370758c9d792a660f2cebbTyler Gunn        mVideoState = videoState;
989011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee        for (CallbackRecord record : mCallbackRecords) {
990011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee            final RemoteConnection connection = this;
991011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee            final Callback callback = record.getCallback();
992011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee            record.getHandler().post(new Runnable() {
993011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee                @Override
994011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee                public void run() {
995011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee                    callback.onVideoStateChanged(connection, videoState);
996011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee                }
997011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee            });
998aa07df84f279a87ad6370758c9d792a660f2cebbTyler Gunn        }
99952d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon    }
10002a46b90222e5c9c73de012382a604a71f9c0c30cSailesh Nepal
1001a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad    /**
1002a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad     * @hide
1003a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad     */
1004011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee    void setVideoProvider(final VideoProvider videoProvider) {
1005a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad        mVideoProvider = videoProvider;
1006011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee        for (CallbackRecord record : mCallbackRecords) {
1007011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee            final RemoteConnection connection = this;
1008011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee            final Callback callback = record.getCallback();
1009011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee            record.getHandler().post(new Runnable() {
1010011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee                @Override
1011011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee                public void run() {
1012011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee                    callback.onVideoProviderChanged(connection, videoProvider);
1013011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee                }
1014011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee            });
1015a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad        }
1016a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad    }
1017a64627c2d3330f6bee8055b2e51ffaf8a122ef2bIhab Awad
101833aaae4a07fdcce223fe74d96d751f4bffa6723aSailesh Nepal    /** @hide */
1019011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee    void setIsVoipAudioMode(final boolean isVoip) {
1020100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee        mIsVoipAudioMode = isVoip;
1021011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee        for (CallbackRecord record : mCallbackRecords) {
1022011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee            final RemoteConnection connection = this;
1023011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee            final Callback callback = record.getCallback();
1024011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee            record.getHandler().post(new Runnable() {
1025011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee                @Override
1026011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee                public void run() {
1027011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee                    callback.onVoipAudioChanged(connection, isVoip);
1028011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee                }
1029011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee            });
103033aaae4a07fdcce223fe74d96d751f4bffa6723aSailesh Nepal        }
103133aaae4a07fdcce223fe74d96d751f4bffa6723aSailesh Nepal    }
1032e7ef59a77d55c9802cc7d919f7dd794bd5fea30eSailesh Nepal
1033e7ef59a77d55c9802cc7d919f7dd794bd5fea30eSailesh Nepal    /** @hide */
1034011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee    void setStatusHints(final StatusHints statusHints) {
1035e7ef59a77d55c9802cc7d919f7dd794bd5fea30eSailesh Nepal        mStatusHints = statusHints;
1036011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee        for (CallbackRecord record : mCallbackRecords) {
1037011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee            final RemoteConnection connection = this;
1038011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee            final Callback callback = record.getCallback();
1039011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee            record.getHandler().post(new Runnable() {
1040011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee                @Override
1041011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee                public void run() {
1042011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee                    callback.onStatusHintsChanged(connection, statusHints);
1043011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee                }
1044011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee            });
1045612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepal        }
1046612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepal    }
1047612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepal
1048612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepal    /** @hide */
1049011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee    void setAddress(final Uri address, final int presentation) {
1050100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee        mAddress = address;
1051100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee        mAddressPresentation = presentation;
1052011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee        for (CallbackRecord record : mCallbackRecords) {
1053011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee            final RemoteConnection connection = this;
1054011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee            final Callback callback = record.getCallback();
1055011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee            record.getHandler().post(new Runnable() {
1056011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee                @Override
1057011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee                public void run() {
1058011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee                    callback.onAddressChanged(connection, address, presentation);
1059011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee                }
1060011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee            });
1061612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepal        }
1062612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepal    }
1063612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepal
1064612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepal    /** @hide */
1065011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee    void setCallerDisplayName(final String callerDisplayName, final int presentation) {
1066612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepal        mCallerDisplayName = callerDisplayName;
1067612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepal        mCallerDisplayNamePresentation = presentation;
1068011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee        for (CallbackRecord record : mCallbackRecords) {
1069011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee            final RemoteConnection connection = this;
1070011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee            final Callback callback = record.getCallback();
1071011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee            record.getHandler().post(new Runnable() {
1072011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee                @Override
1073011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee                public void run() {
1074011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee                    callback.onCallerDisplayNameChanged(
1075011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee                            connection, callerDisplayName, presentation);
1076011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee                }
1077011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee            });
1078e7ef59a77d55c9802cc7d919f7dd794bd5fea30eSailesh Nepal        }
1079e7ef59a77d55c9802cc7d919f7dd794bd5fea30eSailesh Nepal    }
10802ab88cc313fc4af7fb9436e236cd3a5d1ac58478Sailesh Nepal
10812ab88cc313fc4af7fb9436e236cd3a5d1ac58478Sailesh Nepal    /** @hide */
1082011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee    void setConferenceableConnections(final List<RemoteConnection> conferenceableConnections) {
10837c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon        mConferenceableConnections.clear();
10847c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon        mConferenceableConnections.addAll(conferenceableConnections);
1085011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee        for (CallbackRecord record : mCallbackRecords) {
1086011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee            final RemoteConnection connection = this;
1087011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee            final Callback callback = record.getCallback();
1088011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee            record.getHandler().post(new Runnable() {
1089011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee                @Override
1090011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee                public void run() {
1091011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee                    callback.onConferenceableConnectionsChanged(
1092011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee                            connection, mUnmodifiableconferenceableConnections);
1093011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee                }
1094011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee            });
1095b8e85c74e5910a461078704048d67f82b216508cIhab Awad        }
1096b8e85c74e5910a461078704048d67f82b216508cIhab Awad    }
1097b8e85c74e5910a461078704048d67f82b216508cIhab Awad
1098b8e85c74e5910a461078704048d67f82b216508cIhab Awad    /** @hide */
1099011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee    void setConference(final RemoteConference conference) {
1100b8e85c74e5910a461078704048d67f82b216508cIhab Awad        if (mConference != conference) {
1101b8e85c74e5910a461078704048d67f82b216508cIhab Awad            mConference = conference;
1102011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee            for (CallbackRecord record : mCallbackRecords) {
1103011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee                final RemoteConnection connection = this;
1104011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee                final Callback callback = record.getCallback();
1105011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee                record.getHandler().post(new Runnable() {
1106011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee                    @Override
1107011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee                    public void run() {
1108011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee                        callback.onConferenceChanged(connection, conference);
1109011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee                    }
1110011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee                });
1111b8e85c74e5910a461078704048d67f82b216508cIhab Awad            }
11127c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon        }
11137c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon    }
11147c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon
11156b7f955c2d9b231660b8c54f8ef8e8e6ad802625Santos Cordon    /** @hide */
11166b7f955c2d9b231660b8c54f8ef8e8e6ad802625Santos Cordon    void setExtras(final Bundle extras) {
11176b7f955c2d9b231660b8c54f8ef8e8e6ad802625Santos Cordon        mExtras = extras;
11186b7f955c2d9b231660b8c54f8ef8e8e6ad802625Santos Cordon        for (CallbackRecord record : mCallbackRecords) {
11196b7f955c2d9b231660b8c54f8ef8e8e6ad802625Santos Cordon            final RemoteConnection connection = this;
11206b7f955c2d9b231660b8c54f8ef8e8e6ad802625Santos Cordon            final Callback callback = record.getCallback();
11216b7f955c2d9b231660b8c54f8ef8e8e6ad802625Santos Cordon            record.getHandler().post(new Runnable() {
11226b7f955c2d9b231660b8c54f8ef8e8e6ad802625Santos Cordon                @Override
11236b7f955c2d9b231660b8c54f8ef8e8e6ad802625Santos Cordon                public void run() {
11246b7f955c2d9b231660b8c54f8ef8e8e6ad802625Santos Cordon                    callback.onExtrasChanged(connection, extras);
11256b7f955c2d9b231660b8c54f8ef8e8e6ad802625Santos Cordon                }
11266b7f955c2d9b231660b8c54f8ef8e8e6ad802625Santos Cordon            });
11276b7f955c2d9b231660b8c54f8ef8e8e6ad802625Santos Cordon        }
11286b7f955c2d9b231660b8c54f8ef8e8e6ad802625Santos Cordon    }
11296b7f955c2d9b231660b8c54f8ef8e8e6ad802625Santos Cordon
1130bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton    /**
11316107bab041fb7d851fbf865b7310d294aae970c8Ihab Awad     * Create a RemoteConnection represents a failure, and which will be in
11326107bab041fb7d851fbf865b7310d294aae970c8Ihab Awad     * {@link Connection#STATE_DISCONNECTED}. Attempting to use it for anything will almost
11336107bab041fb7d851fbf865b7310d294aae970c8Ihab Awad     * certainly result in bad things happening. Do not do this.
1134bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton     *
1135bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton     * @return a failed {@link RemoteConnection}
1136bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton     *
1137bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton     * @hide
1138bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton     */
11397f3d41fd124dd7c4a8b72c1d48df08a8ee7209ecAndrew Lee    public static RemoteConnection failure(DisconnectCause disconnectCause) {
11407f3d41fd124dd7c4a8b72c1d48df08a8ee7209ecAndrew Lee        return new RemoteConnection(disconnectCause);
1141bf11f98deb09ef54ff4161fba75d22b1a0a458eeEvan Charlton    }
1142011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee
1143011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee    private static final class CallbackRecord extends Callback {
1144011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee        private final Callback mCallback;
1145011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee        private final Handler mHandler;
1146011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee
1147011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee        public CallbackRecord(Callback callback, Handler handler) {
1148011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee            mCallback = callback;
1149011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee            mHandler = handler;
1150011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee        }
1151011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee
1152011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee        public Callback getCallback() {
1153011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee            return mCallback;
1154011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee        }
1155011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee
1156011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee        public Handler getHandler() {
1157011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee            return mHandler;
1158011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee        }
1159011728fc3a4368b601844d225d1f37bf48ea5735Andrew Lee    }
116052d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon}
1161