diff options
author | Sailesh Nepal <sail@google.com> | 2014-06-26 01:05:35 +0000 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2014-06-25 03:38:12 +0000 |
commit | b32d9e53c2fa938498268649f4539f345680dd7d (patch) | |
tree | 70203b725475ca133ff566814e45133479cdf8ca /telecomm | |
parent | aa7e529b47f6e5fb53905a92f99adfa63662ed2c (diff) | |
parent | 506e38690fe5e3b627e243fdc20948c514b87680 (diff) | |
download | frameworks_base-b32d9e53c2fa938498268649f4539f345680dd7d.zip frameworks_base-b32d9e53c2fa938498268649f4539f345680dd7d.tar.gz frameworks_base-b32d9e53c2fa938498268649f4539f345680dd7d.tar.bz2 |
Merge "Add API to cancel outgoing calls"
Diffstat (limited to 'telecomm')
5 files changed, 79 insertions, 30 deletions
diff --git a/telecomm/java/android/telecomm/CallServiceAdapter.java b/telecomm/java/android/telecomm/CallServiceAdapter.java index 30084d0..31e37c4 100644 --- a/telecomm/java/android/telecomm/CallServiceAdapter.java +++ b/telecomm/java/android/telecomm/CallServiceAdapter.java @@ -135,6 +135,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). * diff --git a/telecomm/java/android/telecomm/ConnectionService.java b/telecomm/java/android/telecomm/ConnectionService.java index 4b69a3c..23b99fa 100644 --- a/telecomm/java/android/telecomm/ConnectionService.java +++ b/telecomm/java/android/telecomm/ConnectionService.java @@ -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 diff --git a/telecomm/java/android/telecomm/RemoteConnectionManager.java b/telecomm/java/android/telecomm/RemoteConnectionManager.java index 4201f23..465fae0 100644 --- a/telecomm/java/android/telecomm/RemoteConnectionManager.java +++ b/telecomm/java/android/telecomm/RemoteConnectionManager.java @@ -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."); diff --git a/telecomm/java/android/telecomm/RemoteConnectionService.java b/telecomm/java/android/telecomm/RemoteConnectionService.java index 86a43cb..7658a76 100644 --- a/telecomm/java/android/telecomm/RemoteConnectionService.java +++ b/telecomm/java/android/telecomm/RemoteConnectionService.java @@ -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() { diff --git a/telecomm/java/com/android/internal/telecomm/ICallServiceAdapter.aidl b/telecomm/java/com/android/internal/telecomm/ICallServiceAdapter.aidl index 87c8859..373fb16 100644 --- a/telecomm/java/com/android/internal/telecomm/ICallServiceAdapter.aidl +++ b/telecomm/java/com/android/internal/telecomm/ICallServiceAdapter.aidl @@ -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); |