Add API to cancel outgoing calls

This replaces CallServiceSelectorAdapter.cancelOutgoingCall

Change-Id: I9e5da9c607675bc3c230f6eb6d1cc149a38bf905
This commit is contained in:
Sailesh Nepal
2014-06-25 13:35:14 -07:00
parent ef14da3280
commit 506e38690f
6 changed files with 89 additions and 33 deletions

View File

@@ -27601,6 +27601,7 @@ package android.telecomm {
public final class CallServiceAdapter implements android.os.IBinder.DeathRecipient {
method public void addConferenceCall(java.lang.String);
method public void binderDied();
method public void cancelOutgoingCall(java.lang.String);
method public void handleFailedOutgoingCall(android.telecomm.ConnectionRequest, int, java.lang.String);
method public void handleSuccessfulOutgoingCall(java.lang.String);
method public void handoffCall(java.lang.String);
@@ -27747,7 +27748,7 @@ package android.telecomm {
method public final void abort(java.lang.String);
method public final void answer(java.lang.String);
method public final void call(android.telecomm.CallInfo);
method public void createRemoteOutgoingConnection(android.telecomm.ConnectionRequest, android.telecomm.SimpleResponse<android.telecomm.ConnectionRequest, android.telecomm.RemoteConnection>);
method public void createRemoteOutgoingConnection(android.telecomm.ConnectionRequest, android.telecomm.ConnectionService.OutgoingCallResponse<android.telecomm.RemoteConnection>);
method public final void disconnect(java.lang.String);
method public java.util.Collection<android.telecomm.Connection> getAllConnections();
method public final void hold(java.lang.String);
@@ -27757,7 +27758,7 @@ package android.telecomm {
method public void onConnectionAdded(android.telecomm.Connection);
method public void onConnectionRemoved(android.telecomm.Connection);
method public void onCreateConferenceConnection(java.lang.String, android.telecomm.Connection, android.telecomm.Response<java.lang.String, android.telecomm.Connection>);
method public void onCreateConnections(android.telecomm.ConnectionRequest, android.telecomm.Response<android.telecomm.ConnectionRequest, android.telecomm.Connection>);
method public void onCreateConnections(android.telecomm.ConnectionRequest, android.telecomm.ConnectionService.OutgoingCallResponse<android.telecomm.Connection>);
method public void onCreateIncomingConnection(android.telecomm.ConnectionRequest, android.telecomm.Response<android.telecomm.ConnectionRequest, android.telecomm.Connection>);
method public final void onPostDialContinue(java.lang.String, boolean);
method public final void onPostDialWait(android.telecomm.Connection, java.lang.String);
@@ -27768,6 +27769,12 @@ package android.telecomm {
method public final void unhold(java.lang.String);
}
public static abstract interface ConnectionService.OutgoingCallResponse {
method public abstract void onCancel(android.telecomm.ConnectionRequest);
method public abstract void onFailure(android.telecomm.ConnectionRequest, int, java.lang.String);
method public abstract void onSuccess(android.telecomm.ConnectionRequest, CONNECTION);
}
public class GatewayInfo implements android.os.Parcelable {
method public int describeContents();
method public android.net.Uri getGatewayHandle();
@@ -27848,7 +27855,7 @@ package android.telecomm {
public class RemoteConnectionService implements android.os.IBinder.DeathRecipient {
method public void binderDied();
method public void createOutgoingConnection(android.telecomm.ConnectionRequest, android.telecomm.SimpleResponse<android.telecomm.ConnectionRequest, android.telecomm.RemoteConnection>);
method public void createOutgoingConnection(android.telecomm.ConnectionRequest, android.telecomm.ConnectionService.OutgoingCallResponse<android.telecomm.RemoteConnection>);
method public java.util.List<android.telecomm.Subscription> lookupSubscriptions(android.net.Uri);
}

View File

@@ -134,6 +134,20 @@ public final class CallServiceAdapter implements DeathRecipient {
}
}
/**
* Tells Telecomm to cancel the call.
*
* @param callId The ID of the outgoing call.
*/
public void cancelOutgoingCall(String callId) {
for (ICallServiceAdapter adapter : mAdapters) {
try {
adapter.cancelOutgoingCall(callId);
} catch (RemoteException e) {
}
}
}
/**
* Sets a call's state to active (e.g., an ongoing call where two parties can actively
* communicate).

View File

@@ -52,6 +52,35 @@ public abstract class ConnectionService extends CallService {
private Uri mSubscriptionLookupHandle;
private boolean mAreSubscriptionsInitialized = false;
/**
* A callback for providing the resuilt of creating a connection.
*/
public interface OutgoingCallResponse<CONNECTION> {
/**
* Tells Telecomm that an attempt to place the specified outgoing call succeeded.
*
* @param request The original request.
* @param connection The connection.
*/
void onSuccess(ConnectionRequest request, CONNECTION connection);
/**
* Tells Telecomm that an attempt to place the specified outgoing call failed.
*
* @param request The original request.
* @param code An integer code indicating the reason for failure.
* @param msg A message explaining the reason for failure.
*/
void onFailure(ConnectionRequest request, int code, String msg);
/**
* Tells Telecomm to cancel the call.
*
* @param request The original request.
*/
void onCancel(ConnectionRequest request);
}
private final Connection.Listener mConnectionListener = new Connection.Listener() {
@Override
public void onStateChanged(Connection c, int state) {
@@ -136,30 +165,24 @@ public abstract class ConnectionService extends CallService {
callInfo.getId(),
callInfo.getHandle(),
callInfo.getExtras()),
new Response<ConnectionRequest, Connection>() {
new OutgoingCallResponse<Connection>() {
@Override
public void onResult(ConnectionRequest request, Connection... result) {
if (result != null && result.length != 1) {
Log.d(this, "adapter handleFailedOutgoingCall %s", callInfo);
getAdapter().handleFailedOutgoingCall(
request,
DisconnectCause.ERROR_UNSPECIFIED,
"Created " + result.length + " Connections, expected 1");
for (Connection c : result) {
c.abort();
}
} else {
Log.d(this, "adapter handleSuccessfulOutgoingCall %s",
callInfo.getId());
getAdapter().handleSuccessfulOutgoingCall(callInfo.getId());
addConnection(callInfo.getId(), result[0]);
}
public void onSuccess(ConnectionRequest request, Connection connection) {
Log.d(this, "adapter handleSuccessfulOutgoingCall %s",
callInfo.getId());
getAdapter().handleSuccessfulOutgoingCall(callInfo.getId());
addConnection(callInfo.getId(), connection);
}
@Override
public void onError(ConnectionRequest request, int code, String msg) {
public void onFailure(ConnectionRequest request, int code, String msg) {
getAdapter().handleFailedOutgoingCall(request, code, msg);
}
@Override
public void onCancel(ConnectionRequest request) {
getAdapter().cancelOutgoingCall(callInfo.getId());
}
}
);
}
@@ -389,7 +412,7 @@ public abstract class ConnectionService extends CallService {
public void createRemoteOutgoingConnection(
ConnectionRequest request,
SimpleResponse<ConnectionRequest, RemoteConnection> response) {
OutgoingCallResponse<RemoteConnection> response) {
mRemoteConnectionManager.createOutgoingConnection(request, response);
}
@@ -408,7 +431,7 @@ public abstract class ConnectionService extends CallService {
*/
public void onCreateConnections(
ConnectionRequest request,
Response<ConnectionRequest, Connection> callback) {}
OutgoingCallResponse<Connection> callback) {}
/**
* Returns a new or existing conference connection when the the user elects to convert the

View File

@@ -57,7 +57,7 @@ public class RemoteConnectionManager {
public void createOutgoingConnection(
ConnectionRequest request,
final SimpleResponse<ConnectionRequest, RemoteConnection> response) {
final ConnectionService.OutgoingCallResponse response) {
Subscription subscription = request.getSubscription();
if (subscription == null) {
throw new IllegalArgumentException("subscription must be specified.");

View File

@@ -43,7 +43,7 @@ public class RemoteConnectionService implements DeathRecipient {
private String mConnectionId;
private ConnectionRequest mPendingRequest;
private SimpleResponse<ConnectionRequest, RemoteConnection> mPendingResponse;
private ConnectionService.OutgoingCallResponse<RemoteConnection> mPendingOutgoingCallResponse;
// Remote connection services only support a single connection.
private RemoteConnection mConnection;
@@ -60,7 +60,7 @@ public class RemoteConnectionService implements DeathRecipient {
public void handleSuccessfulOutgoingCall(String connectionId) {
if (isPendingConnection(connectionId)) {
mConnection = new RemoteConnection(mCallService, connectionId);
mPendingResponse.onResult(mPendingRequest, mConnection);
mPendingOutgoingCallResponse.onSuccess(mPendingRequest, mConnection);
clearPendingInformation();
}
}
@@ -72,7 +72,17 @@ public class RemoteConnectionService implements DeathRecipient {
if (isPendingConnection(request.getCallId())) {
// Use mPendingRequest instead of request so that we use the same object that was
// passed in to us.
mPendingResponse.onError(request);
mPendingOutgoingCallResponse.onFailure(mPendingRequest, errorCode, errorMessage);
mConnectionId = null;
clearPendingInformation();
}
}
/** ${inheritDoc} */
@Override
public void cancelOutgoingCall(String connectionId) {
if (isPendingConnection(connectionId)) {
mPendingOutgoingCallResponse.onCancel(mPendingRequest);
mConnectionId = null;
clearPendingInformation();
}
@@ -208,7 +218,7 @@ public class RemoteConnectionService implements DeathRecipient {
*/
public void createOutgoingConnection(
ConnectionRequest request,
SimpleResponse<ConnectionRequest, RemoteConnection> response) {
ConnectionService.OutgoingCallResponse<RemoteConnection> response) {
if (mConnectionId == null) {
String id = UUID.randomUUID().toString();
@@ -216,13 +226,13 @@ public class RemoteConnectionService implements DeathRecipient {
try {
mCallService.call(callInfo);
mConnectionId = id;
mPendingResponse = response;
mPendingOutgoingCallResponse = response;
mPendingRequest = request;
} catch (RemoteException e) {
response.onError(request);
response.onFailure(request, DisconnectCause.ERROR_UNSPECIFIED, e.toString());
}
} else {
response.onError(request);
response.onFailure(request, DisconnectCause.ERROR_UNSPECIFIED, null);
}
}
@@ -254,7 +264,7 @@ public class RemoteConnectionService implements DeathRecipient {
}
private boolean isPendingConnection(String id) {
return TextUtils.equals(mConnectionId, id) && mPendingResponse != null;
return TextUtils.equals(mConnectionId, id) && mPendingOutgoingCallResponse != null;
}
private boolean isCurrentConnection(String id) {
@@ -263,7 +273,7 @@ public class RemoteConnectionService implements DeathRecipient {
private void clearPendingInformation() {
mPendingRequest = null;
mPendingResponse = null;
mPendingOutgoingCallResponse = null;
}
private void destroyConnection() {

View File

@@ -35,6 +35,8 @@ oneway interface ICallServiceAdapter {
void handleFailedOutgoingCall(in ConnectionRequest request, int errorCode, String errorMessage);
void cancelOutgoingCall(String callId);
void setActive(String callId);
void setRinging(String callId);