Merge "Add adhoc conference APIs to RemoteConnection and RemoteConnectionService." am: 329c6ff777

Original change: https://android-review.googlesource.com/c/platform/frameworks/base/+/1388908

Change-Id: I051c16bcaca7f30db5c62772a3d3f39c23f18304
This commit is contained in:
Grace Jia
2020-08-13 18:21:29 +00:00
committed by Automerger Merge Worker
7 changed files with 149 additions and 7 deletions

View File

@ -44071,7 +44071,9 @@ package android.telecom {
method public final void addExistingConnection(android.telecom.PhoneAccountHandle, android.telecom.Connection); method public final void addExistingConnection(android.telecom.PhoneAccountHandle, android.telecom.Connection);
method public final void conferenceRemoteConnections(android.telecom.RemoteConnection, android.telecom.RemoteConnection); method public final void conferenceRemoteConnections(android.telecom.RemoteConnection, android.telecom.RemoteConnection);
method public final void connectionServiceFocusReleased(); method public final void connectionServiceFocusReleased();
method @Nullable public final android.telecom.RemoteConference createRemoteIncomingConference(@Nullable android.telecom.PhoneAccountHandle, @Nullable android.telecom.ConnectionRequest);
method public final android.telecom.RemoteConnection createRemoteIncomingConnection(android.telecom.PhoneAccountHandle, android.telecom.ConnectionRequest); method public final android.telecom.RemoteConnection createRemoteIncomingConnection(android.telecom.PhoneAccountHandle, android.telecom.ConnectionRequest);
method @Nullable public final android.telecom.RemoteConference createRemoteOutgoingConference(@Nullable android.telecom.PhoneAccountHandle, @Nullable android.telecom.ConnectionRequest);
method public final android.telecom.RemoteConnection createRemoteOutgoingConnection(android.telecom.PhoneAccountHandle, android.telecom.ConnectionRequest); method public final android.telecom.RemoteConnection createRemoteOutgoingConnection(android.telecom.PhoneAccountHandle, android.telecom.ConnectionRequest);
method public final java.util.Collection<android.telecom.Conference> getAllConferences(); method public final java.util.Collection<android.telecom.Conference> getAllConferences();
method public final java.util.Collection<android.telecom.Connection> getAllConnections(); method public final java.util.Collection<android.telecom.Connection> getAllConnections();
@ -44302,6 +44304,7 @@ package android.telecom {
public final class RemoteConnection { public final class RemoteConnection {
method public void abort(); method public void abort();
method public void addConferenceParticipants(@NonNull java.util.List<android.net.Uri>);
method public void answer(); method public void answer();
method public void disconnect(); method public void disconnect();
method public android.net.Uri getAddress(); method public android.net.Uri getAddress();

View File

@ -43927,7 +43927,9 @@ package android.telecom {
method public final void addExistingConnection(android.telecom.PhoneAccountHandle, android.telecom.Connection); method public final void addExistingConnection(android.telecom.PhoneAccountHandle, android.telecom.Connection);
method public final void conferenceRemoteConnections(android.telecom.RemoteConnection, android.telecom.RemoteConnection); method public final void conferenceRemoteConnections(android.telecom.RemoteConnection, android.telecom.RemoteConnection);
method public final void connectionServiceFocusReleased(); method public final void connectionServiceFocusReleased();
method @Nullable public final android.telecom.RemoteConference createRemoteIncomingConference(@Nullable android.telecom.PhoneAccountHandle, @Nullable android.telecom.ConnectionRequest);
method public final android.telecom.RemoteConnection createRemoteIncomingConnection(android.telecom.PhoneAccountHandle, android.telecom.ConnectionRequest); method public final android.telecom.RemoteConnection createRemoteIncomingConnection(android.telecom.PhoneAccountHandle, android.telecom.ConnectionRequest);
method @Nullable public final android.telecom.RemoteConference createRemoteOutgoingConference(@Nullable android.telecom.PhoneAccountHandle, @Nullable android.telecom.ConnectionRequest);
method public final android.telecom.RemoteConnection createRemoteOutgoingConnection(android.telecom.PhoneAccountHandle, android.telecom.ConnectionRequest); method public final android.telecom.RemoteConnection createRemoteOutgoingConnection(android.telecom.PhoneAccountHandle, android.telecom.ConnectionRequest);
method public final java.util.Collection<android.telecom.Conference> getAllConferences(); method public final java.util.Collection<android.telecom.Conference> getAllConferences();
method public final java.util.Collection<android.telecom.Connection> getAllConnections(); method public final java.util.Collection<android.telecom.Connection> getAllConnections();
@ -44158,6 +44160,7 @@ package android.telecom {
public final class RemoteConnection { public final class RemoteConnection {
method public void abort(); method public void abort();
method public void addConferenceParticipants(@NonNull java.util.List<android.net.Uri>);
method public void answer(); method public void answer();
method public void disconnect(); method public void disconnect();
method public android.net.Uri getAddress(); method public android.net.Uri getAddress();

View File

@ -2487,6 +2487,42 @@ public abstract class ConnectionService extends Service {
connectionManagerPhoneAccount, request, false); connectionManagerPhoneAccount, request, false);
} }
/**
* Ask some other {@code ConnectionService} to create a {@code RemoteConference} given an
* incoming request. This is used by {@code ConnectionService}s that are registered with
* {@link PhoneAccount#CAPABILITY_ADHOC_CONFERENCE_CALLING}.
*
* @param connectionManagerPhoneAccount See description at
* {@link #onCreateOutgoingConnection(PhoneAccountHandle, ConnectionRequest)}.
* @param request Details about the incoming conference call.
* @return The {@code RemoteConference} object to satisfy this call, or {@code null} to not
* handle the call.
*/
public final @Nullable RemoteConference createRemoteIncomingConference(
@Nullable PhoneAccountHandle connectionManagerPhoneAccount,
@Nullable ConnectionRequest request) {
return mRemoteConnectionManager.createRemoteConference(connectionManagerPhoneAccount,
request, true);
}
/**
* Ask some other {@code ConnectionService} to create a {@code RemoteConference} given an
* outgoing request. This is used by {@code ConnectionService}s that are registered with
* {@link PhoneAccount#CAPABILITY_ADHOC_CONFERENCE_CALLING}.
*
* @param connectionManagerPhoneAccount See description at
* {@link #onCreateOutgoingConnection(PhoneAccountHandle, ConnectionRequest)}.
* @param request Details about the outgoing conference call.
* @return The {@code RemoteConference} object to satisfy this call, or {@code null} to not
* handle the call.
*/
public final @Nullable RemoteConference createRemoteOutgoingConference(
@Nullable PhoneAccountHandle connectionManagerPhoneAccount,
@Nullable ConnectionRequest request) {
return mRemoteConnectionManager.createRemoteConference(connectionManagerPhoneAccount,
request, false);
}
/** /**
* Indicates to the relevant {@code RemoteConnectionService} that the specified * Indicates to the relevant {@code RemoteConnectionService} that the specified
* {@link RemoteConnection}s should be merged into a conference call. * {@link RemoteConnection}s should be merged into a conference call.

View File

@ -16,14 +16,14 @@
package android.telecom; package android.telecom;
import com.android.internal.telecom.IConnectionService;
import android.annotation.Nullable; import android.annotation.Nullable;
import android.annotation.SystemApi; import android.annotation.SystemApi;
import android.os.Bundle; import android.os.Bundle;
import android.os.Handler; import android.os.Handler;
import android.os.RemoteException; import android.os.RemoteException;
import com.android.internal.telecom.IConnectionService;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
@ -154,6 +154,14 @@ public final class RemoteConference {
mConnectionService = connectionService; mConnectionService = connectionService;
} }
/** @hide */
RemoteConference(DisconnectCause disconnectCause) {
mId = "NULL";
mConnectionService = null;
mState = Connection.STATE_DISCONNECTED;
mDisconnectCause = disconnectCause;
}
/** @hide */ /** @hide */
String getId() { String getId() {
return mId; return mId;
@ -583,4 +591,16 @@ public final class RemoteConference {
} }
} }
} }
/**
* Create a {@link RemoteConference} represents a failure, and which will
* be in {@link Connection#STATE_DISCONNECTED}.
*
* @param disconnectCause The disconnect cause.
* @return a failed {@link RemoteConference}
* @hide
*/
public static RemoteConference failure(DisconnectCause disconnectCause) {
return new RemoteConference(disconnectCause);
}
} }

View File

@ -16,10 +16,6 @@
package android.telecom; package android.telecom;
import com.android.internal.telecom.IConnectionService;
import com.android.internal.telecom.IVideoCallback;
import com.android.internal.telecom.IVideoProvider;
import android.annotation.NonNull; import android.annotation.NonNull;
import android.annotation.Nullable; import android.annotation.Nullable;
import android.annotation.SystemApi; import android.annotation.SystemApi;
@ -32,6 +28,10 @@ import android.os.IBinder;
import android.os.RemoteException; import android.os.RemoteException;
import android.view.Surface; import android.view.Surface;
import com.android.internal.telecom.IConnectionService;
import com.android.internal.telecom.IVideoCallback;
import com.android.internal.telecom.IVideoProvider;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
@ -1060,6 +1060,23 @@ public final class RemoteConnection {
} }
} }
/**
* Instructs this {@link RemoteConnection} to initiate a conference with a list of
* participants.
* <p>
*
* @param participants with which conference call will be formed.
*/
public void addConferenceParticipants(@NonNull List<Uri> participants) {
try {
if (mConnected) {
mConnectionService.addConferenceParticipants(mConnectionId, participants,
null /*Session.Info*/);
}
} catch (RemoteException ignored) {
}
}
/** /**
* Set the audio state of this {@code RemoteConnection}. * Set the audio state of this {@code RemoteConnection}.
* *

View File

@ -73,6 +73,37 @@ public class RemoteConnectionManager {
return null; return null;
} }
/**
* Ask a {@code RemoteConnectionService} to create a {@code RemoteConference}.
* @param connectionManagerPhoneAccount See description at
* {@link ConnectionService#onCreateOutgoingConnection(PhoneAccountHandle, ConnectionRequest)}.
* @param request Details about the incoming conference call.
* @param isIncoming {@code true} if it's an incoming conference.
* @return
*/
public RemoteConference createRemoteConference(
PhoneAccountHandle connectionManagerPhoneAccount,
ConnectionRequest request,
boolean isIncoming) {
PhoneAccountHandle accountHandle = request.getAccountHandle();
if (accountHandle == null) {
throw new IllegalArgumentException("accountHandle must be specified.");
}
ComponentName componentName = request.getAccountHandle().getComponentName();
if (!mRemoteConnectionServices.containsKey(componentName)) {
throw new UnsupportedOperationException("accountHandle not supported: "
+ componentName);
}
RemoteConnectionService remoteService = mRemoteConnectionServices.get(componentName);
if (remoteService != null) {
return remoteService.createRemoteConference(
connectionManagerPhoneAccount, request, isIncoming);
}
return null;
}
public void conferenceRemoteConnections(RemoteConnection a, RemoteConnection b) { public void conferenceRemoteConnections(RemoteConnection a, RemoteConnection b) {
if (a.getConnectionService() == b.getConnectionService()) { if (a.getConnectionService() == b.getConnectionService()) {
try { try {

View File

@ -31,9 +31,9 @@ import com.android.internal.telecom.RemoteServiceCallback;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.HashSet; import java.util.HashSet;
import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
import java.util.List;
import java.util.UUID; import java.util.UUID;
/** /**
@ -591,6 +591,38 @@ final class RemoteConnectionService {
} }
} }
RemoteConference createRemoteConference(
PhoneAccountHandle connectionManagerPhoneAccount,
ConnectionRequest request,
boolean isIncoming) {
final String id = UUID.randomUUID().toString();
try {
if (mConferenceById.isEmpty()) {
mOutgoingConnectionServiceRpc.addConnectionServiceAdapter(mServant.getStub(),
null /*Session.Info*/);
}
RemoteConference conference = new RemoteConference(id, mOutgoingConnectionServiceRpc);
mOutgoingConnectionServiceRpc.createConference(connectionManagerPhoneAccount,
id,
request,
isIncoming,
false /* isUnknownCall */,
null /*Session.info*/);
conference.registerCallback(new RemoteConference.Callback() {
@Override
public void onDestroyed(RemoteConference conference) {
mConferenceById.remove(id);
maybeDisconnectAdapter();
}
});
conference.putExtras(request.getExtras());
return conference;
} catch (RemoteException e) {
return RemoteConference.failure(
new DisconnectCause(DisconnectCause.ERROR, e.toString()));
}
}
private boolean hasConnection(String callId) { private boolean hasConnection(String callId) {
return mConnectionById.containsKey(callId); return mConnectionById.containsKey(callId);
} }