Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b32d9e53 authored by Sailesh Nepal's avatar Sailesh Nepal Committed by Android (Google) Code Review
Browse files

Merge "Add API to cancel outgoing calls"

parents aa7e529b 506e3869
Loading
Loading
Loading
Loading
+10 −3
Original line number Diff line number Diff line
@@ -27604,6 +27604,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);
@@ -27750,7 +27751,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);
@@ -27760,7 +27761,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);
@@ -27771,6 +27772,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();
@@ -27851,7 +27858,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);
  }
+14 −0
Original line number Diff line number Diff line
@@ -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).
+43 −20
Original line number Diff line number Diff line
@@ -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 {
                    public void onSuccess(ConnectionRequest request, Connection connection) {
                        Log.d(this, "adapter handleSuccessfulOutgoingCall %s",
                                callInfo.getId());
                        getAdapter().handleSuccessfulOutgoingCall(callInfo.getId());
                            addConnection(callInfo.getId(), result[0]);
                        }
                        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
+1 −1
Original line number Diff line number Diff line
@@ -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.");
+19 −9
Original line number Diff line number Diff line
@@ -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() {
Loading