1bb69b0c2d821a9806fb00037284c399cbc78277dBen Gilad/*
2ab5d282dd6f487578ae86b2d53d0d8edc9b71747Sailesh Nepal * Copyright (C) 2014 The Android Open Source Project
3bb69b0c2d821a9806fb00037284c399cbc78277dBen Gilad *
4bb69b0c2d821a9806fb00037284c399cbc78277dBen Gilad * Licensed under the Apache License, Version 2.0 (the "License");
5bb69b0c2d821a9806fb00037284c399cbc78277dBen Gilad * you may not use this file except in compliance with the License.
6bb69b0c2d821a9806fb00037284c399cbc78277dBen Gilad * You may obtain a copy of the License at
7bb69b0c2d821a9806fb00037284c399cbc78277dBen Gilad *
8bb69b0c2d821a9806fb00037284c399cbc78277dBen Gilad *      http://www.apache.org/licenses/LICENSE-2.0
9bb69b0c2d821a9806fb00037284c399cbc78277dBen Gilad *
10bb69b0c2d821a9806fb00037284c399cbc78277dBen Gilad * Unless required by applicable law or agreed to in writing, software
11bb69b0c2d821a9806fb00037284c399cbc78277dBen Gilad * distributed under the License is distributed on an "AS IS" BASIS,
12bb69b0c2d821a9806fb00037284c399cbc78277dBen Gilad * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13bb69b0c2d821a9806fb00037284c399cbc78277dBen Gilad * See the License for the specific language governing permissions and
14bb69b0c2d821a9806fb00037284c399cbc78277dBen Gilad * limitations under the License.
15bb69b0c2d821a9806fb00037284c399cbc78277dBen Gilad */
16bb69b0c2d821a9806fb00037284c399cbc78277dBen Gilad
17ef9f6f957d897ea0ed82114185b8fa3fefd4917bTyler Gunnpackage android.telecom;
18bb69b0c2d821a9806fb00037284c399cbc78277dBen Gilad
19612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepalimport android.net.Uri;
206b7f955c2d9b231660b8c54f8ef8e8e6ad802625Santos Cordonimport android.os.Bundle;
2152d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordonimport android.os.IBinder.DeathRecipient;
22ab5d282dd6f487578ae86b2d53d0d8edc9b71747Sailesh Nepalimport android.os.RemoteException;
23ab5d282dd6f487578ae86b2d53d0d8edc9b71747Sailesh Nepal
24ef9f6f957d897ea0ed82114185b8fa3fefd4917bTyler Gunnimport com.android.internal.telecom.IConnectionServiceAdapter;
25ef9f6f957d897ea0ed82114185b8fa3fefd4917bTyler Gunnimport com.android.internal.telecom.RemoteServiceCallback;
26bb69b0c2d821a9806fb00037284c399cbc78277dBen Gilad
27b0c0e36faf5b4218f290e95584528a41c1f22f21Jay Shraunerimport java.util.Collections;
284dd9df58a6bf662264f0aebddfb14b850358f9b9Sailesh Nepalimport java.util.Iterator;
29980acb9bd6984a9daad5f584bd35e8d503820200Santos Cordonimport java.util.List;
3052d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordonimport java.util.Set;
31b0c0e36faf5b4218f290e95584528a41c1f22f21Jay Shraunerimport java.util.concurrent.ConcurrentHashMap;
32980acb9bd6984a9daad5f584bd35e8d503820200Santos Cordon
33bb69b0c2d821a9806fb00037284c399cbc78277dBen Gilad/**
342a46b90222e5c9c73de012382a604a71f9c0c30cSailesh Nepal * Provides methods for IConnectionService implementations to interact with the system phone app.
352bed9563edbec63ad41e2cd5fccc205d5b0891e5Sailesh Nepal *
362bed9563edbec63ad41e2cd5fccc205d5b0891e5Sailesh Nepal * @hide
37bb69b0c2d821a9806fb00037284c399cbc78277dBen Gilad */
382a46b90222e5c9c73de012382a604a71f9c0c30cSailesh Nepalfinal class ConnectionServiceAdapter implements DeathRecipient {
39229e3820dce98f64fd4834d5f421faec9a9d7026Jay Shrauner    /**
40229e3820dce98f64fd4834d5f421faec9a9d7026Jay Shrauner     * ConcurrentHashMap constructor params: 8 is initial table size, 0.9f is
41229e3820dce98f64fd4834d5f421faec9a9d7026Jay Shrauner     * load factor before resizing, 1 means we only expect a single thread to
42229e3820dce98f64fd4834d5f421faec9a9d7026Jay Shrauner     * access the map so make only a single shard
43229e3820dce98f64fd4834d5f421faec9a9d7026Jay Shrauner     */
44b0c0e36faf5b4218f290e95584528a41c1f22f21Jay Shrauner    private final Set<IConnectionServiceAdapter> mAdapters = Collections.newSetFromMap(
45229e3820dce98f64fd4834d5f421faec9a9d7026Jay Shrauner            new ConcurrentHashMap<IConnectionServiceAdapter, Boolean>(8, 0.9f, 1));
46ab5d282dd6f487578ae86b2d53d0d8edc9b71747Sailesh Nepal
472a46b90222e5c9c73de012382a604a71f9c0c30cSailesh Nepal    ConnectionServiceAdapter() {
4852d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon    }
4952d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon
502a46b90222e5c9c73de012382a604a71f9c0c30cSailesh Nepal    void addAdapter(IConnectionServiceAdapter adapter) {
5175c36b681e3331f4e60fa62abe4615c1ffc5b401Roshan Pius        for (IConnectionServiceAdapter it : mAdapters) {
5275c36b681e3331f4e60fa62abe4615c1ffc5b401Roshan Pius            if (it.asBinder() == adapter.asBinder()) {
5375c36b681e3331f4e60fa62abe4615c1ffc5b401Roshan Pius                Log.w(this, "Ignoring duplicate adapter addition.");
5475c36b681e3331f4e60fa62abe4615c1ffc5b401Roshan Pius                return;
5575c36b681e3331f4e60fa62abe4615c1ffc5b401Roshan Pius            }
5675c36b681e3331f4e60fa62abe4615c1ffc5b401Roshan Pius        }
5752d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon        if (mAdapters.add(adapter)) {
5852d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon            try {
5952d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon                adapter.asBinder().linkToDeath(this, 0);
6052d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon            } catch (RemoteException e) {
6152d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon                mAdapters.remove(adapter);
6252d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon            }
6352d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon        }
6452d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon    }
6552d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon
662a46b90222e5c9c73de012382a604a71f9c0c30cSailesh Nepal    void removeAdapter(IConnectionServiceAdapter adapter) {
6775c36b681e3331f4e60fa62abe4615c1ffc5b401Roshan Pius        if (adapter != null) {
6875c36b681e3331f4e60fa62abe4615c1ffc5b401Roshan Pius            for (IConnectionServiceAdapter it : mAdapters) {
6975c36b681e3331f4e60fa62abe4615c1ffc5b401Roshan Pius                if (it.asBinder() == adapter.asBinder() && mAdapters.remove(it)) {
7075c36b681e3331f4e60fa62abe4615c1ffc5b401Roshan Pius                    adapter.asBinder().unlinkToDeath(this, 0);
7175c36b681e3331f4e60fa62abe4615c1ffc5b401Roshan Pius                    break;
7275c36b681e3331f4e60fa62abe4615c1ffc5b401Roshan Pius                }
7375c36b681e3331f4e60fa62abe4615c1ffc5b401Roshan Pius            }
7452d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon        }
7552d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon    }
7652d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon
7752d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon    /** ${inheritDoc} */
7852d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon    @Override
7952d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon    public void binderDied() {
804dd9df58a6bf662264f0aebddfb14b850358f9b9Sailesh Nepal        Iterator<IConnectionServiceAdapter> it = mAdapters.iterator();
814dd9df58a6bf662264f0aebddfb14b850358f9b9Sailesh Nepal        while (it.hasNext()) {
824dd9df58a6bf662264f0aebddfb14b850358f9b9Sailesh Nepal            IConnectionServiceAdapter adapter = it.next();
8352d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon            if (!adapter.asBinder().isBinderAlive()) {
844dd9df58a6bf662264f0aebddfb14b850358f9b9Sailesh Nepal                it.remove();
854dd9df58a6bf662264f0aebddfb14b850358f9b9Sailesh Nepal                adapter.asBinder().unlinkToDeath(this, 0);
8652d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon            }
8752d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon        }
88ab5d282dd6f487578ae86b2d53d0d8edc9b71747Sailesh Nepal    }
89bb69b0c2d821a9806fb00037284c399cbc78277dBen Gilad
906107bab041fb7d851fbf865b7310d294aae970c8Ihab Awad    void handleCreateConnectionComplete(
91b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            String id,
92b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            ConnectionRequest request,
93b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            ParcelableConnection connection) {
942a46b90222e5c9c73de012382a604a71f9c0c30cSailesh Nepal        for (IConnectionServiceAdapter adapter : mAdapters) {
9552d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon            try {
964d75bee99b259503d376a7c1604f426001bba75cBrad Ebinger                adapter.handleCreateConnectionComplete(id, request, connection,
974d75bee99b259503d376a7c1604f426001bba75cBrad Ebinger                        Log.getExternalSession());
98506e38690fe5e3b627e243fdc20948c514b87680Sailesh Nepal            } catch (RemoteException e) {
99506e38690fe5e3b627e243fdc20948c514b87680Sailesh Nepal            }
100506e38690fe5e3b627e243fdc20948c514b87680Sailesh Nepal        }
101ab5d282dd6f487578ae86b2d53d0d8edc9b71747Sailesh Nepal    }
102bb69b0c2d821a9806fb00037284c399cbc78277dBen Gilad
103bb69b0c2d821a9806fb00037284c399cbc78277dBen Gilad    /**
104bb69b0c2d821a9806fb00037284c399cbc78277dBen Gilad     * Sets a call's state to active (e.g., an ongoing call where two parties can actively
105bb69b0c2d821a9806fb00037284c399cbc78277dBen Gilad     * communicate).
1063784133b95f1206c0c6bbbddb5921ef396b5b941Santos Cordon     *
1073784133b95f1206c0c6bbbddb5921ef396b5b941Santos Cordon     * @param callId The unique ID of the call whose state is changing to active.
108bb69b0c2d821a9806fb00037284c399cbc78277dBen Gilad     */
1092a46b90222e5c9c73de012382a604a71f9c0c30cSailesh Nepal    void setActive(String callId) {
1102a46b90222e5c9c73de012382a604a71f9c0c30cSailesh Nepal        for (IConnectionServiceAdapter adapter : mAdapters) {
11152d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon            try {
1124d75bee99b259503d376a7c1604f426001bba75cBrad Ebinger                adapter.setActive(callId, Log.getExternalSession());
11352d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon            } catch (RemoteException e) {
11452d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon            }
115ab5d282dd6f487578ae86b2d53d0d8edc9b71747Sailesh Nepal        }
116ab5d282dd6f487578ae86b2d53d0d8edc9b71747Sailesh Nepal    }
117bb69b0c2d821a9806fb00037284c399cbc78277dBen Gilad
118bb69b0c2d821a9806fb00037284c399cbc78277dBen Gilad    /**
119bb69b0c2d821a9806fb00037284c399cbc78277dBen Gilad     * Sets a call's state to ringing (e.g., an inbound ringing call).
1203784133b95f1206c0c6bbbddb5921ef396b5b941Santos Cordon     *
1213784133b95f1206c0c6bbbddb5921ef396b5b941Santos Cordon     * @param callId The unique ID of the call whose state is changing to ringing.
122bb69b0c2d821a9806fb00037284c399cbc78277dBen Gilad     */
1232a46b90222e5c9c73de012382a604a71f9c0c30cSailesh Nepal    void setRinging(String callId) {
1242a46b90222e5c9c73de012382a604a71f9c0c30cSailesh Nepal        for (IConnectionServiceAdapter adapter : mAdapters) {
12552d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon            try {
1264d75bee99b259503d376a7c1604f426001bba75cBrad Ebinger                adapter.setRinging(callId, Log.getExternalSession());
12752d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon            } catch (RemoteException e) {
12852d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon            }
129ab5d282dd6f487578ae86b2d53d0d8edc9b71747Sailesh Nepal        }
130ab5d282dd6f487578ae86b2d53d0d8edc9b71747Sailesh Nepal    }
131bb69b0c2d821a9806fb00037284c399cbc78277dBen Gilad
132bb69b0c2d821a9806fb00037284c399cbc78277dBen Gilad    /**
133bb69b0c2d821a9806fb00037284c399cbc78277dBen Gilad     * Sets a call's state to dialing (e.g., dialing an outbound call).
1343784133b95f1206c0c6bbbddb5921ef396b5b941Santos Cordon     *
1353784133b95f1206c0c6bbbddb5921ef396b5b941Santos Cordon     * @param callId The unique ID of the call whose state is changing to dialing.
136bb69b0c2d821a9806fb00037284c399cbc78277dBen Gilad     */
1372a46b90222e5c9c73de012382a604a71f9c0c30cSailesh Nepal    void setDialing(String callId) {
1382a46b90222e5c9c73de012382a604a71f9c0c30cSailesh Nepal        for (IConnectionServiceAdapter adapter : mAdapters) {
13952d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon            try {
1404d75bee99b259503d376a7c1604f426001bba75cBrad Ebinger                adapter.setDialing(callId, Log.getExternalSession());
14152d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon            } catch (RemoteException e) {
14252d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon            }
143ab5d282dd6f487578ae86b2d53d0d8edc9b71747Sailesh Nepal        }
144ab5d282dd6f487578ae86b2d53d0d8edc9b71747Sailesh Nepal    }
145bb69b0c2d821a9806fb00037284c399cbc78277dBen Gilad
146bb69b0c2d821a9806fb00037284c399cbc78277dBen Gilad    /**
147c96b5e087382a2a530e9c8cf8f2e1f8dbfc439c5Tyler Gunn     * Sets a call's state to pulling (e.g. a call with {@link Connection#PROPERTY_IS_EXTERNAL_CALL}
148c96b5e087382a2a530e9c8cf8f2e1f8dbfc439c5Tyler Gunn     * is being pulled to the local device.
149c96b5e087382a2a530e9c8cf8f2e1f8dbfc439c5Tyler Gunn     *
150c96b5e087382a2a530e9c8cf8f2e1f8dbfc439c5Tyler Gunn     * @param callId The unique ID of the call whose state is changing to dialing.
151c96b5e087382a2a530e9c8cf8f2e1f8dbfc439c5Tyler Gunn     */
152c96b5e087382a2a530e9c8cf8f2e1f8dbfc439c5Tyler Gunn    void setPulling(String callId) {
153c96b5e087382a2a530e9c8cf8f2e1f8dbfc439c5Tyler Gunn        for (IConnectionServiceAdapter adapter : mAdapters) {
154c96b5e087382a2a530e9c8cf8f2e1f8dbfc439c5Tyler Gunn            try {
1554d75bee99b259503d376a7c1604f426001bba75cBrad Ebinger                adapter.setPulling(callId, Log.getExternalSession());
156c96b5e087382a2a530e9c8cf8f2e1f8dbfc439c5Tyler Gunn            } catch (RemoteException e) {
157c96b5e087382a2a530e9c8cf8f2e1f8dbfc439c5Tyler Gunn            }
158c96b5e087382a2a530e9c8cf8f2e1f8dbfc439c5Tyler Gunn        }
159c96b5e087382a2a530e9c8cf8f2e1f8dbfc439c5Tyler Gunn    }
160c96b5e087382a2a530e9c8cf8f2e1f8dbfc439c5Tyler Gunn
161c96b5e087382a2a530e9c8cf8f2e1f8dbfc439c5Tyler Gunn    /**
162bb69b0c2d821a9806fb00037284c399cbc78277dBen Gilad     * Sets a call's state to disconnected.
1633784133b95f1206c0c6bbbddb5921ef396b5b941Santos Cordon     *
1643784133b95f1206c0c6bbbddb5921ef396b5b941Santos Cordon     * @param callId The unique ID of the call whose state is changing to disconnected.
1657f3d41fd124dd7c4a8b72c1d48df08a8ee7209ecAndrew Lee     * @param disconnectCause The reason for the disconnection, as described by
1667f3d41fd124dd7c4a8b72c1d48df08a8ee7209ecAndrew Lee     *            {@link android.telecomm.DisconnectCause}.
167bb69b0c2d821a9806fb00037284c399cbc78277dBen Gilad     */
1687f3d41fd124dd7c4a8b72c1d48df08a8ee7209ecAndrew Lee    void setDisconnected(String callId, DisconnectCause disconnectCause) {
1692a46b90222e5c9c73de012382a604a71f9c0c30cSailesh Nepal        for (IConnectionServiceAdapter adapter : mAdapters) {
17052d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon            try {
1714d75bee99b259503d376a7c1604f426001bba75cBrad Ebinger                adapter.setDisconnected(callId, disconnectCause, Log.getExternalSession());
17252d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon            } catch (RemoteException e) {
17352d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon            }
174ab5d282dd6f487578ae86b2d53d0d8edc9b71747Sailesh Nepal        }
175ab5d282dd6f487578ae86b2d53d0d8edc9b71747Sailesh Nepal    }
17681ccaaa25cc90c576c7df7c2cccb8a232e8536a1Yorke Lee
17781ccaaa25cc90c576c7df7c2cccb8a232e8536a1Yorke Lee    /**
17881ccaaa25cc90c576c7df7c2cccb8a232e8536a1Yorke Lee     * Sets a call's state to be on hold.
17981ccaaa25cc90c576c7df7c2cccb8a232e8536a1Yorke Lee     *
18081ccaaa25cc90c576c7df7c2cccb8a232e8536a1Yorke Lee     * @param callId - The unique ID of the call whose state is changing to be on hold.
18181ccaaa25cc90c576c7df7c2cccb8a232e8536a1Yorke Lee     */
1822a46b90222e5c9c73de012382a604a71f9c0c30cSailesh Nepal    void setOnHold(String callId) {
1832a46b90222e5c9c73de012382a604a71f9c0c30cSailesh Nepal        for (IConnectionServiceAdapter adapter : mAdapters) {
18452d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon            try {
1854d75bee99b259503d376a7c1604f426001bba75cBrad Ebinger                adapter.setOnHold(callId, Log.getExternalSession());
18652d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon            } catch (RemoteException e) {
18752d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon            }
18881ccaaa25cc90c576c7df7c2cccb8a232e8536a1Yorke Lee        }
18981ccaaa25cc90c576c7df7c2cccb8a232e8536a1Yorke Lee    }
19081ccaaa25cc90c576c7df7c2cccb8a232e8536a1Yorke Lee
191f835897f9f799490de27653ae39141ba6bc14223Ihab Awad    /**
192ef9f6f957d897ea0ed82114185b8fa3fefd4917bTyler Gunn     * Asks Telecom to start or stop a ringback tone for a call.
193f835897f9f799490de27653ae39141ba6bc14223Ihab Awad     *
194f835897f9f799490de27653ae39141ba6bc14223Ihab Awad     * @param callId The unique ID of the call whose ringback is being changed.
195ef9f6f957d897ea0ed82114185b8fa3fefd4917bTyler Gunn     * @param ringback Whether Telecom should start playing a ringback tone.
196f835897f9f799490de27653ae39141ba6bc14223Ihab Awad     */
197100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee    void setRingbackRequested(String callId, boolean ringback) {
1982a46b90222e5c9c73de012382a604a71f9c0c30cSailesh Nepal        for (IConnectionServiceAdapter adapter : mAdapters) {
19952d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon            try {
2004d75bee99b259503d376a7c1604f426001bba75cBrad Ebinger                adapter.setRingbackRequested(callId, ringback, Log.getExternalSession());
20152d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon            } catch (RemoteException e) {
20252d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon            }
203f835897f9f799490de27653ae39141ba6bc14223Ihab Awad        }
204f835897f9f799490de27653ae39141ba6bc14223Ihab Awad    }
20581ccaaa25cc90c576c7df7c2cccb8a232e8536a1Yorke Lee
2065c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad    void setConnectionCapabilities(String callId, int capabilities) {
2072a46b90222e5c9c73de012382a604a71f9c0c30cSailesh Nepal        for (IConnectionServiceAdapter adapter : mAdapters) {
20852d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon            try {
2094d75bee99b259503d376a7c1604f426001bba75cBrad Ebinger                adapter.setConnectionCapabilities(callId, capabilities, Log.getExternalSession());
21052d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon            } catch (RemoteException ignored) {
21152d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon            }
212980acb9bd6984a9daad5f584bd35e8d503820200Santos Cordon        }
213980acb9bd6984a9daad5f584bd35e8d503820200Santos Cordon    }
214980acb9bd6984a9daad5f584bd35e8d503820200Santos Cordon
215720c664401081ca00e56c7eef12641ae792da530Tyler Gunn    void setConnectionProperties(String callId, int properties) {
216720c664401081ca00e56c7eef12641ae792da530Tyler Gunn        for (IConnectionServiceAdapter adapter : mAdapters) {
217720c664401081ca00e56c7eef12641ae792da530Tyler Gunn            try {
2184d75bee99b259503d376a7c1604f426001bba75cBrad Ebinger                adapter.setConnectionProperties(callId, properties, Log.getExternalSession());
219720c664401081ca00e56c7eef12641ae792da530Tyler Gunn            } catch (RemoteException ignored) {
220720c664401081ca00e56c7eef12641ae792da530Tyler Gunn            }
221720c664401081ca00e56c7eef12641ae792da530Tyler Gunn        }
222720c664401081ca00e56c7eef12641ae792da530Tyler Gunn    }
223720c664401081ca00e56c7eef12641ae792da530Tyler Gunn
224980acb9bd6984a9daad5f584bd35e8d503820200Santos Cordon    /**
225980acb9bd6984a9daad5f584bd35e8d503820200Santos Cordon     * Indicates whether or not the specified call is currently conferenced into the specified
226980acb9bd6984a9daad5f584bd35e8d503820200Santos Cordon     * conference call.
227980acb9bd6984a9daad5f584bd35e8d503820200Santos Cordon     *
228980acb9bd6984a9daad5f584bd35e8d503820200Santos Cordon     * @param callId The unique ID of the call being conferenced.
229b693998fdfdd4498a33c4c69405f2708e4840aa7Santos Cordon     * @param conferenceCallId The unique ID of the conference call. Null if call is not
23052d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon     *            conferenced.
231980acb9bd6984a9daad5f584bd35e8d503820200Santos Cordon     */
2322a46b90222e5c9c73de012382a604a71f9c0c30cSailesh Nepal    void setIsConferenced(String callId, String conferenceCallId) {
2332a46b90222e5c9c73de012382a604a71f9c0c30cSailesh Nepal        for (IConnectionServiceAdapter adapter : mAdapters) {
23452d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon            try {
2350159ac0cfe20e8f85ee4150e64d91392850f8a3fSantos Cordon                Log.d(this, "sending connection %s with conference %s", callId, conferenceCallId);
2364d75bee99b259503d376a7c1604f426001bba75cBrad Ebinger                adapter.setIsConferenced(callId, conferenceCallId, Log.getExternalSession());
23752d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon            } catch (RemoteException ignored) {
23852d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon            }
239980acb9bd6984a9daad5f584bd35e8d503820200Santos Cordon        }
240980acb9bd6984a9daad5f584bd35e8d503820200Santos Cordon    }
241980acb9bd6984a9daad5f584bd35e8d503820200Santos Cordon
242980acb9bd6984a9daad5f584bd35e8d503820200Santos Cordon    /**
24317455a3d39350a39eb995897929977d793358365Anthony Lee     * Indicates that the merge request on this call has failed.
24417455a3d39350a39eb995897929977d793358365Anthony Lee     *
24517455a3d39350a39eb995897929977d793358365Anthony Lee     * @param callId The unique ID of the call being conferenced.
24617455a3d39350a39eb995897929977d793358365Anthony Lee     */
24717455a3d39350a39eb995897929977d793358365Anthony Lee    void onConferenceMergeFailed(String callId) {
24817455a3d39350a39eb995897929977d793358365Anthony Lee        for (IConnectionServiceAdapter adapter : mAdapters) {
24917455a3d39350a39eb995897929977d793358365Anthony Lee            try {
25017455a3d39350a39eb995897929977d793358365Anthony Lee                Log.d(this, "merge failed for call %s", callId);
2514d75bee99b259503d376a7c1604f426001bba75cBrad Ebinger                adapter.setConferenceMergeFailed(callId, Log.getExternalSession());
25217455a3d39350a39eb995897929977d793358365Anthony Lee            } catch (RemoteException ignored) {
25317455a3d39350a39eb995897929977d793358365Anthony Lee            }
25417455a3d39350a39eb995897929977d793358365Anthony Lee        }
25517455a3d39350a39eb995897929977d793358365Anthony Lee    }
25617455a3d39350a39eb995897929977d793358365Anthony Lee
25717455a3d39350a39eb995897929977d793358365Anthony Lee    /**
258980acb9bd6984a9daad5f584bd35e8d503820200Santos Cordon     * Indicates that the call no longer exists. Can be used with either a call or a conference
259980acb9bd6984a9daad5f584bd35e8d503820200Santos Cordon     * call.
260980acb9bd6984a9daad5f584bd35e8d503820200Santos Cordon     *
261980acb9bd6984a9daad5f584bd35e8d503820200Santos Cordon     * @param callId The unique ID of the call.
262980acb9bd6984a9daad5f584bd35e8d503820200Santos Cordon     */
2632a46b90222e5c9c73de012382a604a71f9c0c30cSailesh Nepal    void removeCall(String callId) {
2642a46b90222e5c9c73de012382a604a71f9c0c30cSailesh Nepal        for (IConnectionServiceAdapter adapter : mAdapters) {
26552d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon            try {
2664d75bee99b259503d376a7c1604f426001bba75cBrad Ebinger                adapter.removeCall(callId, Log.getExternalSession());
26752d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon            } catch (RemoteException ignored) {
26852d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon            }
269980acb9bd6984a9daad5f584bd35e8d503820200Santos Cordon        }
270980acb9bd6984a9daad5f584bd35e8d503820200Santos Cordon    }
2716dea4aceba8f69ee4be346ec356d277a3c153f3dEvan Charlton
2722a46b90222e5c9c73de012382a604a71f9c0c30cSailesh Nepal    void onPostDialWait(String callId, String remaining) {
2732a46b90222e5c9c73de012382a604a71f9c0c30cSailesh Nepal        for (IConnectionServiceAdapter adapter : mAdapters) {
27452d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon            try {
2754d75bee99b259503d376a7c1604f426001bba75cBrad Ebinger                adapter.onPostDialWait(callId, remaining, Log.getExternalSession());
27652d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon            } catch (RemoteException ignored) {
27752d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon            }
2786dea4aceba8f69ee4be346ec356d277a3c153f3dEvan Charlton        }
2796dea4aceba8f69ee4be346ec356d277a3c153f3dEvan Charlton    }
2808b4818d9b4d632f2d460e7ac9dea463b04db43feSailesh Nepal
28127d1c2d148fe377ca0d2744f0f85789a42c8f808Nancy Chen    void onPostDialChar(String callId, char nextChar) {
28227d1c2d148fe377ca0d2744f0f85789a42c8f808Nancy Chen        for (IConnectionServiceAdapter adapter : mAdapters) {
28327d1c2d148fe377ca0d2744f0f85789a42c8f808Nancy Chen            try {
2844d75bee99b259503d376a7c1604f426001bba75cBrad Ebinger                adapter.onPostDialChar(callId, nextChar, Log.getExternalSession());
28527d1c2d148fe377ca0d2744f0f85789a42c8f808Nancy Chen            } catch (RemoteException ignored) {
28627d1c2d148fe377ca0d2744f0f85789a42c8f808Nancy Chen            }
28727d1c2d148fe377ca0d2744f0f85789a42c8f808Nancy Chen        }
28827d1c2d148fe377ca0d2744f0f85789a42c8f808Nancy Chen    }
28927d1c2d148fe377ca0d2744f0f85789a42c8f808Nancy Chen
2908b4818d9b4d632f2d460e7ac9dea463b04db43feSailesh Nepal    /**
291b693998fdfdd4498a33c4c69405f2708e4840aa7Santos Cordon     * Indicates that a new conference call has been created.
292b693998fdfdd4498a33c4c69405f2708e4840aa7Santos Cordon     *
293b693998fdfdd4498a33c4c69405f2708e4840aa7Santos Cordon     * @param callId The unique ID of the conference call.
294b693998fdfdd4498a33c4c69405f2708e4840aa7Santos Cordon     */
295823fd3c79dd4f762bbc778e0ce9e2204b6d3d454Santos Cordon    void addConferenceCall(String callId, ParcelableConference parcelableConference) {
2962a46b90222e5c9c73de012382a604a71f9c0c30cSailesh Nepal        for (IConnectionServiceAdapter adapter : mAdapters) {
29752d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon            try {
2984d75bee99b259503d376a7c1604f426001bba75cBrad Ebinger                adapter.addConferenceCall(callId, parcelableConference, Log.getExternalSession());
29952d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon            } catch (RemoteException ignored) {
30052d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon            }
30152d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon        }
30252d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon    }
30352d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon
30452d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon    /**
30552d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon     * Retrieves a list of remote connection services usable to place calls.
30652d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon     */
3072a46b90222e5c9c73de012382a604a71f9c0c30cSailesh Nepal    void queryRemoteConnectionServices(RemoteServiceCallback callback) {
30852d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon        // Only supported when there is only one adapter.
30952d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon        if (mAdapters.size() == 1) {
31052d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon            try {
3114d75bee99b259503d376a7c1604f426001bba75cBrad Ebinger                mAdapters.iterator().next().queryRemoteConnectionServices(callback,
3124d75bee99b259503d376a7c1604f426001bba75cBrad Ebinger                        Log.getExternalSession());
31352d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon            } catch (RemoteException e) {
31452d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon                Log.e(this, e, "Exception trying to query for remote CSs");
31552d8a15e146e682319380322f94ceb6d93fa1a97Santos Cordon            }
316b693998fdfdd4498a33c4c69405f2708e4840aa7Santos Cordon        }
317b693998fdfdd4498a33c4c69405f2708e4840aa7Santos Cordon    }
3185ffbe8b850c2703b64617f0140d051a5412dd861Andrew Lee
3195ffbe8b850c2703b64617f0140d051a5412dd861Andrew Lee    /**
3205ffbe8b850c2703b64617f0140d051a5412dd861Andrew Lee     * Sets the call video provider for a call.
3215ffbe8b850c2703b64617f0140d051a5412dd861Andrew Lee     *
3225ffbe8b850c2703b64617f0140d051a5412dd861Andrew Lee     * @param callId The unique ID of the call to set with the given call video provider.
323b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad     * @param videoProvider The call video provider instance to set on the call.
3245ffbe8b850c2703b64617f0140d051a5412dd861Andrew Lee     */
325b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad    void setVideoProvider(
326b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            String callId, Connection.VideoProvider videoProvider) {
3272a46b90222e5c9c73de012382a604a71f9c0c30cSailesh Nepal        for (IConnectionServiceAdapter adapter : mAdapters) {
3285ffbe8b850c2703b64617f0140d051a5412dd861Andrew Lee            try {
329b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad                adapter.setVideoProvider(
330e8dc4bef00e391defbdee0264b2ed955b1117841Santos Cordon                        callId,
3314d75bee99b259503d376a7c1604f426001bba75cBrad Ebinger                        videoProvider == null ? null : videoProvider.getInterface(),
3324d75bee99b259503d376a7c1604f426001bba75cBrad Ebinger                        Log.getExternalSession());
3335ffbe8b850c2703b64617f0140d051a5412dd861Andrew Lee            } catch (RemoteException e) {
3345ffbe8b850c2703b64617f0140d051a5412dd861Andrew Lee            }
3355ffbe8b850c2703b64617f0140d051a5412dd861Andrew Lee        }
3365ffbe8b850c2703b64617f0140d051a5412dd861Andrew Lee    }
3378d83fa9bbd2ad15299a4419241eb10404e7839beTyler Gunn
3388d83fa9bbd2ad15299a4419241eb10404e7839beTyler Gunn    /**
33933aaae4a07fdcce223fe74d96d751f4bffa6723aSailesh Nepal     * Requests that the framework use VOIP audio mode for this connection.
34033aaae4a07fdcce223fe74d96d751f4bffa6723aSailesh Nepal     *
34133aaae4a07fdcce223fe74d96d751f4bffa6723aSailesh Nepal     * @param callId The unique ID of the call to set with the given call video provider.
34233aaae4a07fdcce223fe74d96d751f4bffa6723aSailesh Nepal     * @param isVoip True if the audio mode is VOIP.
34333aaae4a07fdcce223fe74d96d751f4bffa6723aSailesh Nepal     */
344100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee    void setIsVoipAudioMode(String callId, boolean isVoip) {
34533aaae4a07fdcce223fe74d96d751f4bffa6723aSailesh Nepal        for (IConnectionServiceAdapter adapter : mAdapters) {
34633aaae4a07fdcce223fe74d96d751f4bffa6723aSailesh Nepal            try {
3474d75bee99b259503d376a7c1604f426001bba75cBrad Ebinger                adapter.setIsVoipAudioMode(callId, isVoip, Log.getExternalSession());
34833aaae4a07fdcce223fe74d96d751f4bffa6723aSailesh Nepal            } catch (RemoteException e) {
34933aaae4a07fdcce223fe74d96d751f4bffa6723aSailesh Nepal            }
35033aaae4a07fdcce223fe74d96d751f4bffa6723aSailesh Nepal        }
35133aaae4a07fdcce223fe74d96d751f4bffa6723aSailesh Nepal    }
35233aaae4a07fdcce223fe74d96d751f4bffa6723aSailesh Nepal
353e7ef59a77d55c9802cc7d919f7dd794bd5fea30eSailesh Nepal    void setStatusHints(String callId, StatusHints statusHints) {
354e7ef59a77d55c9802cc7d919f7dd794bd5fea30eSailesh Nepal        for (IConnectionServiceAdapter adapter : mAdapters) {
355e7ef59a77d55c9802cc7d919f7dd794bd5fea30eSailesh Nepal            try {
3564d75bee99b259503d376a7c1604f426001bba75cBrad Ebinger                adapter.setStatusHints(callId, statusHints, Log.getExternalSession());
357e7ef59a77d55c9802cc7d919f7dd794bd5fea30eSailesh Nepal            } catch (RemoteException e) {
358e7ef59a77d55c9802cc7d919f7dd794bd5fea30eSailesh Nepal            }
359e7ef59a77d55c9802cc7d919f7dd794bd5fea30eSailesh Nepal        }
360e7ef59a77d55c9802cc7d919f7dd794bd5fea30eSailesh Nepal    }
361e7ef59a77d55c9802cc7d919f7dd794bd5fea30eSailesh Nepal
362100e293fa8021caed956597daa4e01cb19be1c33Andrew Lee    void setAddress(String callId, Uri address, int presentation) {
3632a46b90222e5c9c73de012382a604a71f9c0c30cSailesh Nepal        for (IConnectionServiceAdapter adapter : mAdapters) {
3648d83fa9bbd2ad15299a4419241eb10404e7839beTyler Gunn            try {
3654d75bee99b259503d376a7c1604f426001bba75cBrad Ebinger                adapter.setAddress(callId, address, presentation, Log.getExternalSession());
366612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepal            } catch (RemoteException e) {
367612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepal            }
368612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepal        }
369612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepal    }
370612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepal
371612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepal    void setCallerDisplayName(String callId, String callerDisplayName, int presentation) {
372612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepal        for (IConnectionServiceAdapter adapter : mAdapters) {
373612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepal            try {
3744d75bee99b259503d376a7c1604f426001bba75cBrad Ebinger                adapter.setCallerDisplayName(callId, callerDisplayName, presentation,
3754d75bee99b259503d376a7c1604f426001bba75cBrad Ebinger                        Log.getExternalSession());
376612038642fa9cf1545dbcc8274d313192ce928b5Sailesh Nepal            } catch (RemoteException e) {
3778d83fa9bbd2ad15299a4419241eb10404e7839beTyler Gunn            }
3788d83fa9bbd2ad15299a4419241eb10404e7839beTyler Gunn        }
3798d83fa9bbd2ad15299a4419241eb10404e7839beTyler Gunn    }
380aa07df84f279a87ad6370758c9d792a660f2cebbTyler Gunn
381aa07df84f279a87ad6370758c9d792a660f2cebbTyler Gunn    /**
382aa07df84f279a87ad6370758c9d792a660f2cebbTyler Gunn     * Sets the video state associated with a call.
383aa07df84f279a87ad6370758c9d792a660f2cebbTyler Gunn     *
38487b73f370e2b8a76b0540580f43edba6ec21c6cfTyler Gunn     * Valid values: {@link VideoProfile#STATE_BIDIRECTIONAL},
38587b73f370e2b8a76b0540580f43edba6ec21c6cfTyler Gunn     * {@link VideoProfile#STATE_AUDIO_ONLY},
38687b73f370e2b8a76b0540580f43edba6ec21c6cfTyler Gunn     * {@link VideoProfile#STATE_TX_ENABLED},
38787b73f370e2b8a76b0540580f43edba6ec21c6cfTyler Gunn     * {@link VideoProfile#STATE_RX_ENABLED}.
388aa07df84f279a87ad6370758c9d792a660f2cebbTyler Gunn     *
389aa07df84f279a87ad6370758c9d792a660f2cebbTyler Gunn     * @param callId The unique ID of the call to set the video state for.
390aa07df84f279a87ad6370758c9d792a660f2cebbTyler Gunn     * @param videoState The video state.
391aa07df84f279a87ad6370758c9d792a660f2cebbTyler Gunn     */
392aa07df84f279a87ad6370758c9d792a660f2cebbTyler Gunn    void setVideoState(String callId, int videoState) {
393aa07df84f279a87ad6370758c9d792a660f2cebbTyler Gunn        Log.v(this, "setVideoState: %d", videoState);
394aa07df84f279a87ad6370758c9d792a660f2cebbTyler Gunn        for (IConnectionServiceAdapter adapter : mAdapters) {
395aa07df84f279a87ad6370758c9d792a660f2cebbTyler Gunn            try {
3964d75bee99b259503d376a7c1604f426001bba75cBrad Ebinger                adapter.setVideoState(callId, videoState, Log.getExternalSession());
397aa07df84f279a87ad6370758c9d792a660f2cebbTyler Gunn            } catch (RemoteException ignored) {
398aa07df84f279a87ad6370758c9d792a660f2cebbTyler Gunn            }
399aa07df84f279a87ad6370758c9d792a660f2cebbTyler Gunn        }
400aa07df84f279a87ad6370758c9d792a660f2cebbTyler Gunn    }
4012ab88cc313fc4af7fb9436e236cd3a5d1ac58478Sailesh Nepal
4027c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon    void setConferenceableConnections(String callId, List<String> conferenceableCallIds) {
4037c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon        Log.v(this, "setConferenceableConnections: %s, %s", callId, conferenceableCallIds);
4047c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon        for (IConnectionServiceAdapter adapter : mAdapters) {
4057c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon            try {
4064d75bee99b259503d376a7c1604f426001bba75cBrad Ebinger                adapter.setConferenceableConnections(callId, conferenceableCallIds,
4074d75bee99b259503d376a7c1604f426001bba75cBrad Ebinger                        Log.getExternalSession());
4087c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon            } catch (RemoteException ignored) {
4097c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon            }
4107c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon        }
4117c7bc7f6917484250974c5da00af9ef756844b0aSantos Cordon    }
4124a57b9b59b74c97e559a301af0add13cd4c3331cTyler Gunn
4134a57b9b59b74c97e559a301af0add13cd4c3331cTyler Gunn    /**
4144a57b9b59b74c97e559a301af0add13cd4c3331cTyler Gunn     * Informs telecom of an existing connection which was added by the {@link ConnectionService}.
4154a57b9b59b74c97e559a301af0add13cd4c3331cTyler Gunn     *
4164a57b9b59b74c97e559a301af0add13cd4c3331cTyler Gunn     * @param callId The unique ID of the call being added.
4174a57b9b59b74c97e559a301af0add13cd4c3331cTyler Gunn     * @param connection The connection.
4184a57b9b59b74c97e559a301af0add13cd4c3331cTyler Gunn     */
4194a57b9b59b74c97e559a301af0add13cd4c3331cTyler Gunn    void addExistingConnection(String callId, ParcelableConnection connection) {
4204a57b9b59b74c97e559a301af0add13cd4c3331cTyler Gunn        Log.v(this, "addExistingConnection: %s", callId);
4214a57b9b59b74c97e559a301af0add13cd4c3331cTyler Gunn        for (IConnectionServiceAdapter adapter : mAdapters) {
4224a57b9b59b74c97e559a301af0add13cd4c3331cTyler Gunn            try {
4234d75bee99b259503d376a7c1604f426001bba75cBrad Ebinger                adapter.addExistingConnection(callId, connection, Log.getExternalSession());
4244a57b9b59b74c97e559a301af0add13cd4c3331cTyler Gunn            } catch (RemoteException ignored) {
4254a57b9b59b74c97e559a301af0add13cd4c3331cTyler Gunn            }
4264a57b9b59b74c97e559a301af0add13cd4c3331cTyler Gunn        }
4274a57b9b59b74c97e559a301af0add13cd4c3331cTyler Gunn    }
4286b7f955c2d9b231660b8c54f8ef8e8e6ad802625Santos Cordon
4296b7f955c2d9b231660b8c54f8ef8e8e6ad802625Santos Cordon    /**
430dee56a8a79f9daa1e597f5d4f399d3a5feedcac4Tyler Gunn     * Adds some extras associated with a {@code Connection}.
4316b7f955c2d9b231660b8c54f8ef8e8e6ad802625Santos Cordon     *
4326b7f955c2d9b231660b8c54f8ef8e8e6ad802625Santos Cordon     * @param callId The unique ID of the call.
433dee56a8a79f9daa1e597f5d4f399d3a5feedcac4Tyler Gunn     * @param extras The extras to add.
4346b7f955c2d9b231660b8c54f8ef8e8e6ad802625Santos Cordon     */
435dee56a8a79f9daa1e597f5d4f399d3a5feedcac4Tyler Gunn    void putExtras(String callId, Bundle extras) {
436dee56a8a79f9daa1e597f5d4f399d3a5feedcac4Tyler Gunn        Log.v(this, "putExtras: %s", callId);
4376b7f955c2d9b231660b8c54f8ef8e8e6ad802625Santos Cordon        for (IConnectionServiceAdapter adapter : mAdapters) {
4386b7f955c2d9b231660b8c54f8ef8e8e6ad802625Santos Cordon            try {
4394d75bee99b259503d376a7c1604f426001bba75cBrad Ebinger                adapter.putExtras(callId, extras, Log.getExternalSession());
440dee56a8a79f9daa1e597f5d4f399d3a5feedcac4Tyler Gunn            } catch (RemoteException ignored) {
441dee56a8a79f9daa1e597f5d4f399d3a5feedcac4Tyler Gunn            }
442dee56a8a79f9daa1e597f5d4f399d3a5feedcac4Tyler Gunn        }
443dee56a8a79f9daa1e597f5d4f399d3a5feedcac4Tyler Gunn    }
444dee56a8a79f9daa1e597f5d4f399d3a5feedcac4Tyler Gunn
445dee56a8a79f9daa1e597f5d4f399d3a5feedcac4Tyler Gunn    /**
446dee56a8a79f9daa1e597f5d4f399d3a5feedcac4Tyler Gunn     * Adds an extra associated with a {@code Connection}.
447dee56a8a79f9daa1e597f5d4f399d3a5feedcac4Tyler Gunn     *
448dee56a8a79f9daa1e597f5d4f399d3a5feedcac4Tyler Gunn     * @param callId The unique ID of the call.
449dee56a8a79f9daa1e597f5d4f399d3a5feedcac4Tyler Gunn     * @param key The extra key.
450dee56a8a79f9daa1e597f5d4f399d3a5feedcac4Tyler Gunn     * @param value The extra value.
451dee56a8a79f9daa1e597f5d4f399d3a5feedcac4Tyler Gunn     */
452dee56a8a79f9daa1e597f5d4f399d3a5feedcac4Tyler Gunn    void putExtra(String callId, String key, boolean value) {
453dee56a8a79f9daa1e597f5d4f399d3a5feedcac4Tyler Gunn        Log.v(this, "putExtra: %s %s=%b", callId, key, value);
454dee56a8a79f9daa1e597f5d4f399d3a5feedcac4Tyler Gunn        for (IConnectionServiceAdapter adapter : mAdapters) {
455dee56a8a79f9daa1e597f5d4f399d3a5feedcac4Tyler Gunn            try {
456dee56a8a79f9daa1e597f5d4f399d3a5feedcac4Tyler Gunn                Bundle bundle = new Bundle();
457dee56a8a79f9daa1e597f5d4f399d3a5feedcac4Tyler Gunn                bundle.putBoolean(key, value);
4584d75bee99b259503d376a7c1604f426001bba75cBrad Ebinger                adapter.putExtras(callId, bundle, Log.getExternalSession());
459dee56a8a79f9daa1e597f5d4f399d3a5feedcac4Tyler Gunn            } catch (RemoteException ignored) {
460dee56a8a79f9daa1e597f5d4f399d3a5feedcac4Tyler Gunn            }
461dee56a8a79f9daa1e597f5d4f399d3a5feedcac4Tyler Gunn        }
462dee56a8a79f9daa1e597f5d4f399d3a5feedcac4Tyler Gunn    }
463dee56a8a79f9daa1e597f5d4f399d3a5feedcac4Tyler Gunn
464dee56a8a79f9daa1e597f5d4f399d3a5feedcac4Tyler Gunn    /**
465dee56a8a79f9daa1e597f5d4f399d3a5feedcac4Tyler Gunn     * Adds an extra associated with a {@code Connection}.
466dee56a8a79f9daa1e597f5d4f399d3a5feedcac4Tyler Gunn     *
467dee56a8a79f9daa1e597f5d4f399d3a5feedcac4Tyler Gunn     * @param callId The unique ID of the call.
468dee56a8a79f9daa1e597f5d4f399d3a5feedcac4Tyler Gunn     * @param key The extra key.
469dee56a8a79f9daa1e597f5d4f399d3a5feedcac4Tyler Gunn     * @param value The extra value.
470dee56a8a79f9daa1e597f5d4f399d3a5feedcac4Tyler Gunn     */
471dee56a8a79f9daa1e597f5d4f399d3a5feedcac4Tyler Gunn    void putExtra(String callId, String key, int value) {
472dee56a8a79f9daa1e597f5d4f399d3a5feedcac4Tyler Gunn        Log.v(this, "putExtra: %s %s=%d", callId, key, value);
473dee56a8a79f9daa1e597f5d4f399d3a5feedcac4Tyler Gunn        for (IConnectionServiceAdapter adapter : mAdapters) {
474dee56a8a79f9daa1e597f5d4f399d3a5feedcac4Tyler Gunn            try {
475dee56a8a79f9daa1e597f5d4f399d3a5feedcac4Tyler Gunn                Bundle bundle = new Bundle();
476dee56a8a79f9daa1e597f5d4f399d3a5feedcac4Tyler Gunn                bundle.putInt(key, value);
4774d75bee99b259503d376a7c1604f426001bba75cBrad Ebinger                adapter.putExtras(callId, bundle, Log.getExternalSession());
478dee56a8a79f9daa1e597f5d4f399d3a5feedcac4Tyler Gunn            } catch (RemoteException ignored) {
479dee56a8a79f9daa1e597f5d4f399d3a5feedcac4Tyler Gunn            }
480dee56a8a79f9daa1e597f5d4f399d3a5feedcac4Tyler Gunn        }
481dee56a8a79f9daa1e597f5d4f399d3a5feedcac4Tyler Gunn    }
482dee56a8a79f9daa1e597f5d4f399d3a5feedcac4Tyler Gunn
483dee56a8a79f9daa1e597f5d4f399d3a5feedcac4Tyler Gunn    /**
484dee56a8a79f9daa1e597f5d4f399d3a5feedcac4Tyler Gunn     * Adds an extra associated with a {@code Connection}.
485dee56a8a79f9daa1e597f5d4f399d3a5feedcac4Tyler Gunn     *
486dee56a8a79f9daa1e597f5d4f399d3a5feedcac4Tyler Gunn     * @param callId The unique ID of the call.
487dee56a8a79f9daa1e597f5d4f399d3a5feedcac4Tyler Gunn     * @param key The extra key.
488dee56a8a79f9daa1e597f5d4f399d3a5feedcac4Tyler Gunn     * @param value The extra value.
489dee56a8a79f9daa1e597f5d4f399d3a5feedcac4Tyler Gunn     */
490dee56a8a79f9daa1e597f5d4f399d3a5feedcac4Tyler Gunn    void putExtra(String callId, String key, String value) {
491dee56a8a79f9daa1e597f5d4f399d3a5feedcac4Tyler Gunn        Log.v(this, "putExtra: %s %s=%s", callId, key, value);
492dee56a8a79f9daa1e597f5d4f399d3a5feedcac4Tyler Gunn        for (IConnectionServiceAdapter adapter : mAdapters) {
493dee56a8a79f9daa1e597f5d4f399d3a5feedcac4Tyler Gunn            try {
494dee56a8a79f9daa1e597f5d4f399d3a5feedcac4Tyler Gunn                Bundle bundle = new Bundle();
495dee56a8a79f9daa1e597f5d4f399d3a5feedcac4Tyler Gunn                bundle.putString(key, value);
4964d75bee99b259503d376a7c1604f426001bba75cBrad Ebinger                adapter.putExtras(callId, bundle, Log.getExternalSession());
497dee56a8a79f9daa1e597f5d4f399d3a5feedcac4Tyler Gunn            } catch (RemoteException ignored) {
498dee56a8a79f9daa1e597f5d4f399d3a5feedcac4Tyler Gunn            }
499dee56a8a79f9daa1e597f5d4f399d3a5feedcac4Tyler Gunn        }
500dee56a8a79f9daa1e597f5d4f399d3a5feedcac4Tyler Gunn    }
501dee56a8a79f9daa1e597f5d4f399d3a5feedcac4Tyler Gunn
502dee56a8a79f9daa1e597f5d4f399d3a5feedcac4Tyler Gunn    /**
503dee56a8a79f9daa1e597f5d4f399d3a5feedcac4Tyler Gunn     * Removes extras associated with a {@code Connection}.
504dee56a8a79f9daa1e597f5d4f399d3a5feedcac4Tyler Gunn     *  @param callId The unique ID of the call.
505dee56a8a79f9daa1e597f5d4f399d3a5feedcac4Tyler Gunn     * @param keys The extra keys to remove.
506dee56a8a79f9daa1e597f5d4f399d3a5feedcac4Tyler Gunn     */
507dee56a8a79f9daa1e597f5d4f399d3a5feedcac4Tyler Gunn    void removeExtras(String callId, List<String> keys) {
508dee56a8a79f9daa1e597f5d4f399d3a5feedcac4Tyler Gunn        Log.v(this, "removeExtras: %s %s", callId, keys);
509dee56a8a79f9daa1e597f5d4f399d3a5feedcac4Tyler Gunn        for (IConnectionServiceAdapter adapter : mAdapters) {
510dee56a8a79f9daa1e597f5d4f399d3a5feedcac4Tyler Gunn            try {
5114d75bee99b259503d376a7c1604f426001bba75cBrad Ebinger                adapter.removeExtras(callId, keys, Log.getExternalSession());
5126b7f955c2d9b231660b8c54f8ef8e8e6ad802625Santos Cordon            } catch (RemoteException ignored) {
5136b7f955c2d9b231660b8c54f8ef8e8e6ad802625Santos Cordon            }
5146b7f955c2d9b231660b8c54f8ef8e8e6ad802625Santos Cordon        }
5156b7f955c2d9b231660b8c54f8ef8e8e6ad802625Santos Cordon    }
516bd1eb1f105e99d55fe87d758e8eafbe55a221a30Tyler Gunn
517bd1eb1f105e99d55fe87d758e8eafbe55a221a30Tyler Gunn    /**
518f50354363c2bace924c6aeea5746b3c690a7108eTyler Gunn     * Sets the audio route associated with a {@link Connection}.
519f50354363c2bace924c6aeea5746b3c690a7108eTyler Gunn     *
520f50354363c2bace924c6aeea5746b3c690a7108eTyler Gunn     * @param callId The unique ID of the call.
521f50354363c2bace924c6aeea5746b3c690a7108eTyler Gunn     * @param audioRoute The new audio route (see {@code CallAudioState#ROUTE_*}).
522f50354363c2bace924c6aeea5746b3c690a7108eTyler Gunn     */
523f50354363c2bace924c6aeea5746b3c690a7108eTyler Gunn    void setAudioRoute(String callId, int audioRoute) {
524f50354363c2bace924c6aeea5746b3c690a7108eTyler Gunn        Log.v(this, "setAudioRoute: %s %s", callId, CallAudioState.audioRouteToString(audioRoute));
525f50354363c2bace924c6aeea5746b3c690a7108eTyler Gunn        for (IConnectionServiceAdapter adapter : mAdapters) {
526f50354363c2bace924c6aeea5746b3c690a7108eTyler Gunn            try {
527f50354363c2bace924c6aeea5746b3c690a7108eTyler Gunn                adapter.setAudioRoute(callId, audioRoute, Log.getExternalSession());
528f50354363c2bace924c6aeea5746b3c690a7108eTyler Gunn            } catch (RemoteException ignored) {
529f50354363c2bace924c6aeea5746b3c690a7108eTyler Gunn            }
530f50354363c2bace924c6aeea5746b3c690a7108eTyler Gunn        }
531f50354363c2bace924c6aeea5746b3c690a7108eTyler Gunn    }
532f50354363c2bace924c6aeea5746b3c690a7108eTyler Gunn
533f50354363c2bace924c6aeea5746b3c690a7108eTyler Gunn
534f50354363c2bace924c6aeea5746b3c690a7108eTyler Gunn    /**
535bd1eb1f105e99d55fe87d758e8eafbe55a221a30Tyler Gunn     * Informs Telecom of a connection level event.
536bd1eb1f105e99d55fe87d758e8eafbe55a221a30Tyler Gunn     *
537bd1eb1f105e99d55fe87d758e8eafbe55a221a30Tyler Gunn     * @param callId The unique ID of the call.
538bd1eb1f105e99d55fe87d758e8eafbe55a221a30Tyler Gunn     * @param event The event.
539876dbfb4767da4a2ba5459d5b78fb6eb55e4516fTyler Gunn     * @param extras Extras associated with the event.
540bd1eb1f105e99d55fe87d758e8eafbe55a221a30Tyler Gunn     */
541876dbfb4767da4a2ba5459d5b78fb6eb55e4516fTyler Gunn    void onConnectionEvent(String callId, String event, Bundle extras) {
542bd1eb1f105e99d55fe87d758e8eafbe55a221a30Tyler Gunn        Log.v(this, "onConnectionEvent: %s", event);
543bd1eb1f105e99d55fe87d758e8eafbe55a221a30Tyler Gunn        for (IConnectionServiceAdapter adapter : mAdapters) {
544bd1eb1f105e99d55fe87d758e8eafbe55a221a30Tyler Gunn            try {
5454d75bee99b259503d376a7c1604f426001bba75cBrad Ebinger                adapter.onConnectionEvent(callId, event, extras, Log.getExternalSession());
546bd1eb1f105e99d55fe87d758e8eafbe55a221a30Tyler Gunn            } catch (RemoteException ignored) {
547bd1eb1f105e99d55fe87d758e8eafbe55a221a30Tyler Gunn            }
548bd1eb1f105e99d55fe87d758e8eafbe55a221a30Tyler Gunn        }
549bd1eb1f105e99d55fe87d758e8eafbe55a221a30Tyler Gunn    }
55057006aa82a69740df73415a456d31993e2785e24Hall Liu
55157006aa82a69740df73415a456d31993e2785e24Hall Liu    /**
55257006aa82a69740df73415a456d31993e2785e24Hall Liu     * Notifies Telecom that an RTT session was successfully established.
55357006aa82a69740df73415a456d31993e2785e24Hall Liu     *
55457006aa82a69740df73415a456d31993e2785e24Hall Liu     * @param callId The unique ID of the call.
55557006aa82a69740df73415a456d31993e2785e24Hall Liu     */
55657006aa82a69740df73415a456d31993e2785e24Hall Liu    void onRttInitiationSuccess(String callId) {
55757006aa82a69740df73415a456d31993e2785e24Hall Liu        Log.v(this, "onRttInitiationSuccess: %s", callId);
55857006aa82a69740df73415a456d31993e2785e24Hall Liu        for (IConnectionServiceAdapter adapter : mAdapters) {
55957006aa82a69740df73415a456d31993e2785e24Hall Liu            try {
56057006aa82a69740df73415a456d31993e2785e24Hall Liu                adapter.onRttInitiationSuccess(callId, Log.getExternalSession());
56157006aa82a69740df73415a456d31993e2785e24Hall Liu            } catch (RemoteException ignored) {
56257006aa82a69740df73415a456d31993e2785e24Hall Liu            }
56357006aa82a69740df73415a456d31993e2785e24Hall Liu        }
56457006aa82a69740df73415a456d31993e2785e24Hall Liu    }
56557006aa82a69740df73415a456d31993e2785e24Hall Liu
56657006aa82a69740df73415a456d31993e2785e24Hall Liu    /**
56757006aa82a69740df73415a456d31993e2785e24Hall Liu     * Notifies Telecom that a requested RTT session failed to be established.
56857006aa82a69740df73415a456d31993e2785e24Hall Liu     *
56957006aa82a69740df73415a456d31993e2785e24Hall Liu     * @param callId The unique ID of the call.
57057006aa82a69740df73415a456d31993e2785e24Hall Liu     */
57157006aa82a69740df73415a456d31993e2785e24Hall Liu    void onRttInitiationFailure(String callId, int reason) {
57257006aa82a69740df73415a456d31993e2785e24Hall Liu        Log.v(this, "onRttInitiationFailure: %s", callId);
57357006aa82a69740df73415a456d31993e2785e24Hall Liu        for (IConnectionServiceAdapter adapter : mAdapters) {
57457006aa82a69740df73415a456d31993e2785e24Hall Liu            try {
57557006aa82a69740df73415a456d31993e2785e24Hall Liu                adapter.onRttInitiationFailure(callId, reason, Log.getExternalSession());
57657006aa82a69740df73415a456d31993e2785e24Hall Liu            } catch (RemoteException ignored) {
57757006aa82a69740df73415a456d31993e2785e24Hall Liu            }
57857006aa82a69740df73415a456d31993e2785e24Hall Liu        }
57957006aa82a69740df73415a456d31993e2785e24Hall Liu    }
58057006aa82a69740df73415a456d31993e2785e24Hall Liu
58157006aa82a69740df73415a456d31993e2785e24Hall Liu    /**
58257006aa82a69740df73415a456d31993e2785e24Hall Liu     * Notifies Telecom that an established RTT session was terminated by the remote user on
58357006aa82a69740df73415a456d31993e2785e24Hall Liu     * the call.
58457006aa82a69740df73415a456d31993e2785e24Hall Liu     *
58557006aa82a69740df73415a456d31993e2785e24Hall Liu     * @param callId The unique ID of the call.
58657006aa82a69740df73415a456d31993e2785e24Hall Liu     */
58757006aa82a69740df73415a456d31993e2785e24Hall Liu    void onRttSessionRemotelyTerminated(String callId) {
58857006aa82a69740df73415a456d31993e2785e24Hall Liu        Log.v(this, "onRttSessionRemotelyTerminated: %s", callId);
58957006aa82a69740df73415a456d31993e2785e24Hall Liu        for (IConnectionServiceAdapter adapter : mAdapters) {
59057006aa82a69740df73415a456d31993e2785e24Hall Liu            try {
59157006aa82a69740df73415a456d31993e2785e24Hall Liu                adapter.onRttSessionRemotelyTerminated(callId, Log.getExternalSession());
59257006aa82a69740df73415a456d31993e2785e24Hall Liu            } catch (RemoteException ignored) {
59357006aa82a69740df73415a456d31993e2785e24Hall Liu            }
59457006aa82a69740df73415a456d31993e2785e24Hall Liu        }
59557006aa82a69740df73415a456d31993e2785e24Hall Liu    }
59657006aa82a69740df73415a456d31993e2785e24Hall Liu
59757006aa82a69740df73415a456d31993e2785e24Hall Liu    /**
59857006aa82a69740df73415a456d31993e2785e24Hall Liu     * Notifies Telecom that the remote user on the call has requested an upgrade to an RTT
59957006aa82a69740df73415a456d31993e2785e24Hall Liu     * session for this call.
60057006aa82a69740df73415a456d31993e2785e24Hall Liu     *
60157006aa82a69740df73415a456d31993e2785e24Hall Liu     * @param callId The unique ID of the call.
60257006aa82a69740df73415a456d31993e2785e24Hall Liu     */
60357006aa82a69740df73415a456d31993e2785e24Hall Liu    void onRemoteRttRequest(String callId) {
60457006aa82a69740df73415a456d31993e2785e24Hall Liu        Log.v(this, "onRemoteRttRequest: %s", callId);
60557006aa82a69740df73415a456d31993e2785e24Hall Liu        for (IConnectionServiceAdapter adapter : mAdapters) {
60657006aa82a69740df73415a456d31993e2785e24Hall Liu            try {
60757006aa82a69740df73415a456d31993e2785e24Hall Liu                adapter.onRemoteRttRequest(callId, Log.getExternalSession());
60857006aa82a69740df73415a456d31993e2785e24Hall Liu            } catch (RemoteException ignored) {
60957006aa82a69740df73415a456d31993e2785e24Hall Liu            }
61057006aa82a69740df73415a456d31993e2785e24Hall Liu        }
61157006aa82a69740df73415a456d31993e2785e24Hall Liu    }
612bb69b0c2d821a9806fb00037284c399cbc78277dBen Gilad}
613