blob: fbbfefd9d00e1e88db5d92001f0195b1a6d7523c [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) {
Santos Cordon52d8a152014-06-17 19:08:45 -070042 if (!mRemoteConnectionServices.containsKey(componentName)) {
43 try {
Ihab Awadb8e85c72014-08-23 20:34:57 -070044 RemoteConnectionService remoteConnectionService = new RemoteConnectionService(
45 outgoingConnectionServiceRpc,
46 mOurConnectionServiceImpl);
Santos Cordon52d8a152014-06-17 19:08:45 -070047 mRemoteConnectionServices.put(componentName, remoteConnectionService);
Grace Jia6caf1e22021-05-10 23:17:36 -070048 } catch (RemoteException e) {
49 Log.w(RemoteConnectionManager.this,
50 "error when addConnectionService of %s: %s", componentName,
51 e.toString());
Santos Cordon52d8a152014-06-17 19:08:45 -070052 }
53 }
54 }
55
Evan Charltonbf11f982014-07-20 22:06:28 -070056 public RemoteConnection createRemoteConnection(
Ihab Awadf8b69882014-07-25 15:14:01 -070057 PhoneAccountHandle connectionManagerPhoneAccount,
Santos Cordon52d8a152014-06-17 19:08:45 -070058 ConnectionRequest request,
Sailesh Nepalc5b01572014-07-14 16:29:44 -070059 boolean isIncoming) {
Evan Charlton8c8a0622014-07-20 12:31:00 -070060 PhoneAccountHandle accountHandle = request.getAccountHandle();
61 if (accountHandle == null) {
62 throw new IllegalArgumentException("accountHandle must be specified.");
Santos Cordon52d8a152014-06-17 19:08:45 -070063 }
64
Evan Charlton8c8a0622014-07-20 12:31:00 -070065 ComponentName componentName = request.getAccountHandle().getComponentName();
Santos Cordon52d8a152014-06-17 19:08:45 -070066 if (!mRemoteConnectionServices.containsKey(componentName)) {
Evan Charlton8c8a0622014-07-20 12:31:00 -070067 throw new UnsupportedOperationException("accountHandle not supported: "
68 + componentName);
Santos Cordon52d8a152014-06-17 19:08:45 -070069 }
Evan Charltonbf11f982014-07-20 22:06:28 -070070
71 RemoteConnectionService remoteService = mRemoteConnectionServices.get(componentName);
72 if (remoteService != null) {
Ihab Awadf8b69882014-07-25 15:14:01 -070073 return remoteService.createRemoteConnection(
74 connectionManagerPhoneAccount, request, isIncoming);
Evan Charltonbf11f982014-07-20 22:06:28 -070075 }
76 return null;
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();
97 if (!mRemoteConnectionServices.containsKey(componentName)) {
98 throw new UnsupportedOperationException("accountHandle not supported: "
99 + componentName);
100 }
101
102 RemoteConnectionService remoteService = mRemoteConnectionServices.get(componentName);
103 if (remoteService != null) {
104 return remoteService.createRemoteConference(
105 connectionManagerPhoneAccount, request, isIncoming);
106 }
107 return null;
108 }
109
Ihab Awadb8e85c72014-08-23 20:34:57 -0700110 public void conferenceRemoteConnections(RemoteConnection a, RemoteConnection b) {
111 if (a.getConnectionService() == b.getConnectionService()) {
112 try {
Brad Ebingerb32d4f82016-10-24 16:40:49 -0700113 a.getConnectionService().conference(a.getId(), b.getId(), null /*Session.Info*/);
Ihab Awadb8e85c72014-08-23 20:34:57 -0700114 } catch (RemoteException e) {
115 }
116 } else {
117 Log.w(this, "Request to conference incompatible remote connections (%s,%s) (%s,%s)",
118 a.getConnectionService(), a.getId(),
119 b.getConnectionService(), b.getId());
120 }
121 }
Santos Cordon52d8a152014-06-17 19:08:45 -0700122}