blob: fbf8eeffd9472a4ff70dcac7837771be3f9635bc [file] [log] [blame]
Santos Cordon52d8a152014-06-17 19:08:45 -07001/*
2 * Copyright (C) 2014 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 R* limitations under the License.
15 */
16
Tyler Gunnef9f6f92014-09-12 22:16:17 -070017package android.telecom;
Santos Cordon52d8a152014-06-17 19:08:45 -070018
19import android.content.ComponentName;
Santos Cordon52d8a152014-06-17 19:08:45 -070020import android.os.RemoteException;
21
Tyler Gunnef9f6f92014-09-12 22:16:17 -070022import com.android.internal.telecom.IConnectionService;
Santos Cordon52d8a152014-06-17 19:08:45 -070023
24import java.util.HashMap;
Santos Cordon52d8a152014-06-17 19:08:45 -070025import java.util.Map;
26
27/**
28 * @hide
29 */
30public class RemoteConnectionManager {
Ihab Awadb8e85c72014-08-23 20:34:57 -070031 private final Map<ComponentName, RemoteConnectionService> mRemoteConnectionServices =
32 new HashMap<>();
33 private final ConnectionService mOurConnectionServiceImpl;
Santos Cordon52d8a152014-06-17 19:08:45 -070034
Ihab Awadb8e85c72014-08-23 20:34:57 -070035 public RemoteConnectionManager(ConnectionService ourConnectionServiceImpl) {
36 mOurConnectionServiceImpl = ourConnectionServiceImpl;
37 }
38
39 void addConnectionService(
40 ComponentName componentName,
41 IConnectionService outgoingConnectionServiceRpc) {
Mateus Azisddcbe632023-08-16 09:31:20 -070042 mRemoteConnectionServices.computeIfAbsent(
43 componentName,
44 key -> {
45 try {
46 return new RemoteConnectionService(
47 outgoingConnectionServiceRpc, mOurConnectionServiceImpl);
48 } catch (RemoteException e) {
49 Log.w(
50 RemoteConnectionManager.this,
51 "error when addConnectionService of %s: %s",
52 componentName,
53 e.toString());
54 return null;
55 }
56 });
Santos Cordon52d8a152014-06-17 19:08:45 -070057 }
58
Evan Charltonbf11f982014-07-20 22:06:28 -070059 public RemoteConnection createRemoteConnection(
Ihab Awadf8b69882014-07-25 15:14:01 -070060 PhoneAccountHandle connectionManagerPhoneAccount,
Santos Cordon52d8a152014-06-17 19:08:45 -070061 ConnectionRequest request,
Sailesh Nepalc5b01572014-07-14 16:29:44 -070062 boolean isIncoming) {
Evan Charlton8c8a0622014-07-20 12:31:00 -070063 PhoneAccountHandle accountHandle = request.getAccountHandle();
64 if (accountHandle == null) {
65 throw new IllegalArgumentException("accountHandle must be specified.");
Santos Cordon52d8a152014-06-17 19:08:45 -070066 }
67
Evan Charlton8c8a0622014-07-20 12:31:00 -070068 ComponentName componentName = request.getAccountHandle().getComponentName();
Mateus Azisddcbe632023-08-16 09:31:20 -070069 RemoteConnectionService remoteService = mRemoteConnectionServices.get(componentName);
70 if (remoteService == null) {
Evan Charlton8c8a0622014-07-20 12:31:00 -070071 throw new UnsupportedOperationException("accountHandle not supported: "
72 + componentName);
Santos Cordon52d8a152014-06-17 19:08:45 -070073 }
Evan Charltonbf11f982014-07-20 22:06:28 -070074
Mateus Azisddcbe632023-08-16 09:31:20 -070075 return remoteService.createRemoteConnection(
76 connectionManagerPhoneAccount, request, isIncoming);
Santos Cordon52d8a152014-06-17 19:08:45 -070077 }
Ihab Awadb8e85c72014-08-23 20:34:57 -070078
Grace Jia9a09c672020-08-04 12:52:09 -070079 /**
80 * Ask a {@code RemoteConnectionService} to create a {@code RemoteConference}.
81 * @param connectionManagerPhoneAccount See description at
82 * {@link ConnectionService#onCreateOutgoingConnection(PhoneAccountHandle, ConnectionRequest)}.
83 * @param request Details about the incoming conference call.
84 * @param isIncoming {@code true} if it's an incoming conference.
85 * @return
86 */
87 public RemoteConference createRemoteConference(
88 PhoneAccountHandle connectionManagerPhoneAccount,
89 ConnectionRequest request,
90 boolean isIncoming) {
91 PhoneAccountHandle accountHandle = request.getAccountHandle();
92 if (accountHandle == null) {
93 throw new IllegalArgumentException("accountHandle must be specified.");
94 }
95
96 ComponentName componentName = request.getAccountHandle().getComponentName();
Mateus Azisddcbe632023-08-16 09:31:20 -070097 RemoteConnectionService remoteService = mRemoteConnectionServices.get(componentName);
98 if (remoteService == null) {
Grace Jia9a09c672020-08-04 12:52:09 -070099 throw new UnsupportedOperationException("accountHandle not supported: "
100 + componentName);
101 }
102
Mateus Azisddcbe632023-08-16 09:31:20 -0700103 return remoteService.createRemoteConference(
104 connectionManagerPhoneAccount, request, isIncoming);
Grace Jia9a09c672020-08-04 12:52:09 -0700105 }
106
Ihab Awadb8e85c72014-08-23 20:34:57 -0700107 public void conferenceRemoteConnections(RemoteConnection a, RemoteConnection b) {
108 if (a.getConnectionService() == b.getConnectionService()) {
109 try {
Brad Ebingerb32d4f82016-10-24 16:40:49 -0700110 a.getConnectionService().conference(a.getId(), b.getId(), null /*Session.Info*/);
Ihab Awadb8e85c72014-08-23 20:34:57 -0700111 } catch (RemoteException e) {
112 }
113 } else {
114 Log.w(this, "Request to conference incompatible remote connections (%s,%s) (%s,%s)",
115 a.getConnectionService(), a.getId(),
116 b.getConnectionService(), b.getId());
117 }
118 }
Santos Cordon52d8a152014-06-17 19:08:45 -0700119}