Merge "Improve remote connection logging." into rvc-dev

This commit is contained in:
Tyler Gunn
2020-04-21 15:23:07 +00:00
committed by Android (Google) Code Review
4 changed files with 87 additions and 4 deletions

View File

@@ -733,6 +733,31 @@ public abstract class Connection extends Conferenceable {
public static final String EXTRA_ORIGINAL_CONNECTION_ID =
"android.telecom.extra.ORIGINAL_CONNECTION_ID";
/**
* Extra key set on a {@link Connection} when it was created via a remote connection service.
* For example, if a connection manager requests a remote connection service to create a call
* using one of the remote connection service's phone account handle, this extra will be set so
* that Telecom knows that the wrapped remote connection originated in a remote connection
* service. We stash this in the extras since connection managers will typically copy the
* extras from a {@link RemoteConnection} to a {@link Connection} (there is ultimately not
* other way to relate a {@link RemoteConnection} to a {@link Connection}.
* @hide
*/
public static final String EXTRA_REMOTE_PHONE_ACCOUNT_HANDLE =
"android.telecom.extra.REMOTE_PHONE_ACCOUNT_HANDLE";
/**
* Extra key set from a {@link ConnectionService} when using the remote connection APIs
* (e.g. {@link RemoteConnectionService#createRemoteConnection(PhoneAccountHandle,
* ConnectionRequest, boolean)}) to create a remote connection. Provides the receiving
* {@link ConnectionService} with a means to know the package name of the requesting
* {@link ConnectionService} so that {@link #EXTRA_REMOTE_PHONE_ACCOUNT_HANDLE} can be set for
* better visibility in Telecom of where a connection ultimately originated.
* @hide
*/
public static final String EXTRA_REMOTE_CONNECTION_ORIGINATING_PACKAGE_NAME =
"android.telecom.extra.REMOTE_CONNECTION_ORIGINATING_PACKAGE_NAME";
/**
* Boolean connection extra key set on the extras passed to
* {@link Connection#sendConnectionEvent} which indicates that audio is present

View File

@@ -1859,9 +1859,25 @@ public abstract class ConnectionService extends Service {
new DisconnectCause(DisconnectCause.ERROR, "IMPL_RETURNED_NULL_CONFERENCE"),
request.getAccountHandle());
}
if (conference.getExtras() != null) {
conference.getExtras().putString(Connection.EXTRA_ORIGINAL_CONNECTION_ID, callId);
Bundle extras = request.getExtras();
Bundle newExtras = new Bundle();
newExtras.putString(Connection.EXTRA_ORIGINAL_CONNECTION_ID, callId);
if (extras != null) {
// If the request originated from a remote connection service, we will add some
// tracking information that Telecom can use to keep informed of which package
// made the remote request, and which remote connection service was used.
if (extras.containsKey(Connection.EXTRA_REMOTE_CONNECTION_ORIGINATING_PACKAGE_NAME)) {
newExtras.putString(
Connection.EXTRA_REMOTE_CONNECTION_ORIGINATING_PACKAGE_NAME,
extras.getString(
Connection.EXTRA_REMOTE_CONNECTION_ORIGINATING_PACKAGE_NAME));
newExtras.putParcelable(Connection.EXTRA_REMOTE_PHONE_ACCOUNT_HANDLE,
request.getAccountHandle());
}
}
conference.putExtras(newExtras);
mConferenceById.put(callId, conference);
mIdByConference.put(conference, callId);
conference.addListener(mConferenceListener);
@@ -1936,6 +1952,30 @@ public abstract class ConnectionService extends Service {
Log.i(this, "createConnection, implementation returned null connection.");
connection = Connection.createFailedConnection(
new DisconnectCause(DisconnectCause.ERROR, "IMPL_RETURNED_NULL_CONNECTION"));
} else {
try {
Bundle extras = request.getExtras();
if (extras != null) {
// If the request originated from a remote connection service, we will add some
// tracking information that Telecom can use to keep informed of which package
// made the remote request, and which remote connection service was used.
if (extras.containsKey(
Connection.EXTRA_REMOTE_CONNECTION_ORIGINATING_PACKAGE_NAME)) {
Bundle newExtras = new Bundle();
newExtras.putString(
Connection.EXTRA_REMOTE_CONNECTION_ORIGINATING_PACKAGE_NAME,
extras.getString(
Connection.EXTRA_REMOTE_CONNECTION_ORIGINATING_PACKAGE_NAME
));
newExtras.putParcelable(Connection.EXTRA_REMOTE_PHONE_ACCOUNT_HANDLE,
request.getAccountHandle());
connection.putExtras(newExtras);
}
}
} catch (UnsupportedOperationException ose) {
// Do nothing; if the ConnectionService reported a failure it will be an instance
// of an immutable Connection which we cannot edit, so we're out of luck.
}
}
boolean isSelfManaged =

View File

@@ -427,7 +427,7 @@ public class Session {
StringBuilder methodName = new StringBuilder();
methodName.append(getFullMethodPath(false /*truncatePath*/));
if (mOwnerInfo != null && !mOwnerInfo.isEmpty()) {
methodName.append("(InCall package: ");
methodName.append("(");
methodName.append(mOwnerInfo);
methodName.append(")");
}

View File

@@ -258,6 +258,9 @@ final class RemoteConnectionService {
// See comments on Connection.EXTRA_ORIGINAL_CONNECTION_ID for more information.
Bundle newExtras = new Bundle();
newExtras.putString(Connection.EXTRA_ORIGINAL_CONNECTION_ID, callId);
// Track the fact this request was relayed through the remote connection service.
newExtras.putParcelable(Connection.EXTRA_REMOTE_PHONE_ACCOUNT_HANDLE,
parcel.getPhoneAccount());
conference.putExtras(newExtras);
conference.registerCallback(new RemoteConference.Callback() {
@@ -383,6 +386,11 @@ final class RemoteConnectionService {
RemoteConnection remoteConnection = new RemoteConnection(callId,
mOutgoingConnectionServiceRpc, connection, callingPackage,
callingTargetSdkVersion);
// Track that it is via a remote connection.
Bundle newExtras = new Bundle();
newExtras.putParcelable(Connection.EXTRA_REMOTE_PHONE_ACCOUNT_HANDLE,
connection.getPhoneAccount());
remoteConnection.putExtras(newExtras);
mConnectionById.put(callId, remoteConnection);
remoteConnection.registerCallback(new RemoteConnection.Callback() {
@Override
@@ -535,10 +543,20 @@ final class RemoteConnectionService {
ConnectionRequest request,
boolean isIncoming) {
final String id = UUID.randomUUID().toString();
Bundle extras = new Bundle();
if (request.getExtras() != null) {
extras.putAll(request.getExtras());
}
// We will set the package name for the originator of the remote request; this lets the
// receiving ConnectionService know that the request originated from a remote connection
// service so that it can provide tracking information for Telecom.
extras.putString(Connection.EXTRA_REMOTE_CONNECTION_ORIGINATING_PACKAGE_NAME,
mOurConnectionServiceImpl.getApplicationContext().getOpPackageName());
final ConnectionRequest newRequest = new ConnectionRequest.Builder()
.setAccountHandle(request.getAccountHandle())
.setAddress(request.getAddress())
.setExtras(request.getExtras())
.setExtras(extras)
.setVideoState(request.getVideoState())
.setRttPipeFromInCall(request.getRttPipeFromInCall())
.setRttPipeToInCall(request.getRttPipeToInCall())