Add API to cancel outgoing calls
This replaces CallServiceSelectorAdapter.cancelOutgoingCall Change-Id: I9e5da9c607675bc3c230f6eb6d1cc149a38bf905
This commit is contained in:
@@ -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).
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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.");
|
||||
|
||||
@@ -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() {
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user