Support for Telecom Call IDs.

Add support for caching telecom call ID in connection and conference
classes.

Enhance connection service call ID generation:
For "existing calls", the connection service will try to use a call ID
of the format ClassName@ID
Where ClassName is the ComponentName of the connection service, and ID
is a unique incrementing ID for the connection service.

Bug: 23357902
Change-Id: I2284b018465e2b330fc8a3b556758e9f34a2daba
This commit is contained in:
Tyler Gunn
2015-09-01 10:59:48 -07:00
parent 8e88b37833
commit f0500bd635
4 changed files with 113 additions and 7 deletions

View File

@@ -115,6 +115,8 @@ public abstract class ConnectionService extends Service {
private boolean mAreAccountsInitialized = false;
private Conference sNullConference;
private Object mIdSyncRoot = new Object();
private int mId = 0;
private final IBinder mBinder = new IConnectionService.Stub() {
@Override
@@ -611,7 +613,8 @@ public abstract class ConnectionService extends Service {
boolean isIncoming,
boolean isUnknown) {
Log.d(this, "createConnection, callManagerAccount: %s, callId: %s, request: %s, " +
"isIncoming: %b, isUnknown: %b", callManagerAccount, callId, request, isIncoming,
"isIncoming: %b, isUnknown: %b", callManagerAccount, callId, request,
isIncoming,
isUnknown);
Connection connection = isUnknown ? onCreateUnknownConnection(callManagerAccount, request)
@@ -623,6 +626,7 @@ public abstract class ConnectionService extends Service {
new DisconnectCause(DisconnectCause.ERROR));
}
connection.setTelecomCallId(callId);
if (connection.getState() != Connection.STATE_DISCONNECTED) {
addConnection(callId, connection);
}
@@ -930,6 +934,7 @@ public abstract class ConnectionService extends Service {
connectionIds.add(mIdByConnection.get(connection));
}
}
conference.setTelecomCallId(id);
ParcelableConference parcelableConference = new ParcelableConference(
conference.getPhoneAccountHandle(),
conference.getState(),
@@ -966,7 +971,7 @@ public abstract class ConnectionService extends Service {
public final void addExistingConnection(PhoneAccountHandle phoneAccountHandle,
Connection connection) {
String id = addExistingConnectionInternal(connection);
String id = addExistingConnectionInternal(phoneAccountHandle, connection);
if (id != null) {
List<String> emptyList = new ArrayList<>(0);
@@ -1128,18 +1133,29 @@ public abstract class ConnectionService extends Service {
}
/**
* Adds an existing connection to the list of connections, identified by a new UUID.
* Adds an existing connection to the list of connections, identified by a new call ID unique
* to this connection service.
*
* @param connection The connection.
* @return The UUID of the connection (e.g. the call-id).
* @return The ID of the connection (e.g. the call-id).
*/
private String addExistingConnectionInternal(Connection connection) {
String id = UUID.randomUUID().toString();
private String addExistingConnectionInternal(PhoneAccountHandle handle, Connection connection) {
String id;
if (handle == null) {
// If no phone account handle was provided, we cannot be sure the call ID is unique,
// so just use a random UUID.
id = UUID.randomUUID().toString();
} else {
// Phone account handle was provided, so use the ConnectionService class name as a
// prefix for a unique incremental call ID.
id = handle.getComponentName().getClassName() + "@" + getNextCallId();
}
addConnection(id, connection);
return id;
}
private void addConnection(String callId, Connection connection) {
connection.setTelecomCallId(callId);
mConnectionById.put(callId, connection);
mIdByConnection.put(connection, callId);
connection.addConnectionListener(mConnectionListener);
@@ -1160,6 +1176,9 @@ public abstract class ConnectionService extends Service {
if (mIdByConference.containsKey(conference)) {
Log.w(this, "Re-adding an existing conference: %s.", conference);
} else if (conference != null) {
// Conferences do not (yet) have a PhoneAccountHandle associated with them, so we
// cannot determine a ConnectionService class name to associate with the ID, so use
// a unique UUID (for now).
String id = UUID.randomUUID().toString();
mConferenceById.put(id, conference);
mIdByConference.put(conference, id);
@@ -1261,4 +1280,15 @@ public abstract class ConnectionService extends Service {
conference.onDisconnect();
}
}
/**
* Retrieves the next call ID as maintainted by the connection service.
*
* @return The call ID.
*/
private int getNextCallId() {
synchronized(mIdSyncRoot) {
return ++mId;
}
}
}