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

Commit f67d9630 authored by Grant Menke's avatar Grant Menke Committed by Android (Google) Code Review
Browse files

Merge "Update Telecom with new API to add conference from conn." into main

parents b1470279 943c00d0
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -44181,6 +44181,7 @@ package android.telecom {
  public abstract class ConnectionService extends android.app.Service {
    ctor public ConnectionService();
    method public final void addConference(android.telecom.Conference);
    method @FlaggedApi("com.android.server.telecom.flags.reuse_original_conn_remote_conf_api") public final void addConferenceFromConnection(@NonNull android.telecom.Conference, @NonNull android.telecom.Connection);
    method public final void addExistingConnection(android.telecom.PhoneAccountHandle, android.telecom.Connection);
    method public final void conferenceRemoteConnections(android.telecom.RemoteConnection, android.telecom.RemoteConnection);
    method public final void connectionServiceFocusReleased();
+86 −0
Original line number Diff line number Diff line
@@ -3042,6 +3042,92 @@ public abstract class ConnectionService extends Service {
        mRemoteConnectionManager.conferenceRemoteConnections(remoteConnection1, remoteConnection2);
    }

    /**
     * This is used to make a {@link Connection} become a {@link Conference} when the remote party
     * merges calls together. In prior API revisions, the {@link Connection} would be disconnected
     * and re-added as a {@link Conference}; this method accomplishes that in a single step and
     * maintains attributes such as the call duration associated with the {@link Connection}.
     *
     * @param conference The new conference object.
     * @param originalConnection The original connection object.
     */
    @FlaggedApi(Flags.FLAG_REUSE_ORIGINAL_CONN_REMOTE_CONF_API)
    public final void addConferenceFromConnection(@NonNull Conference conference,
            @NonNull Connection originalConnection) {
        Log.d(this, "addConferenceFromConnection: conference=%s "
                + "originalConnection=%s", conference, originalConnection);

        if (originalConnection == null || conference == null) {
            Log.w(this, "addConferenceFromConnection: parameter is null");
            throw new IllegalArgumentException("A NonNull parameter is null");
        }

        String id = mIdByConnection.get(originalConnection);

        if (id != null) {
            // Conduct cleanup by getting rid of the original connection in Telecom here:
            mConnectionById.remove(id);
            mIdByConnection.remove(originalConnection);
        } else {
            Log.w(this, "addConferenceFromConnection: Original connection not "
                    + "found in CS.");
            throw new IllegalArgumentException("Original connection not found in CS");
        }

        if (mIdByConference.containsKey(conference)) {
            Log.w(this, "Re-adding an existing conference: %s.", conference);
            throw new IllegalArgumentException("This conference has already been added");
        } else {
            mConferenceById.put(id, conference);
            mIdByConference.put(conference, id);
            conference.addListener(mConferenceListener);
        }

        List<String> connectionIds = new ArrayList<>(2);
        for (Connection childConnection : conference.getConnections()) {
            if (mIdByConnection.containsKey(childConnection)) {
                connectionIds.add(mIdByConnection.get(childConnection));
            }
        }

        conference.setTelecomCallId(id);
        ParcelableConference parcelableConference = new ParcelableConference.Builder(
                conference.getPhoneAccountHandle(), conference.getState())
                .setConnectionCapabilities(conference.getConnectionCapabilities())
                .setConnectionProperties(conference.getConnectionProperties())
                .setConnectionIds(connectionIds)
                .setVideoAttributes(conference.getVideoProvider() == null
                                ? null : conference.getVideoProvider().getInterface(),
                        conference.getVideoState())
                .setConnectTimeMillis(conference.getConnectTimeMillis(),
                        conference.getConnectionStartElapsedRealtimeMillis())
                .setStatusHints(conference.getStatusHints())
                .setExtras(conference.getExtras())
                .setAddress(conference.getAddress(), conference.getAddressPresentation())
                .setCallerDisplayName(conference.getCallerDisplayName(),
                        conference.getCallerDisplayNamePresentation())
                .setDisconnectCause(conference.getDisconnectCause())
                .setRingbackRequested(conference.isRingbackRequested())
                .setCallDirection(conference.getCallDirection())
                .build();

        mAdapter.addConferenceCallFromConnection(id, parcelableConference);
        // In some instances a conference can start its life as a standalone call with just a
        // single participant; ensure we signal to Telecom in this case.
        if (!conference.isMultiparty()) {
            mAdapter.setConferenceState(id, conference.isMultiparty());
        }

        // Go through any child calls and set the parent.
        for (Connection childConnection : conference.getConnections()) {
            String connectionId = mIdByConnection.get(childConnection);
            if (connectionId != null) {
                mAdapter.setIsConferenced(connectionId, id);
            }
        }
        onConferenceAdded(conference);
    }

    /**
     * Adds a new conference call. When a conference call is created either as a result of an
     * explicit request via {@link #onConference} or otherwise, the connection service should supply
+15 −0
Original line number Diff line number Diff line
@@ -333,6 +333,21 @@ final class ConnectionServiceAdapter implements DeathRecipient {
        }
    }

    /**
     * Indicates that a conference call has been created by converting an existing telecom call.
     *
     * @param callId The unique ID of the conference call.
     */
    void addConferenceCallFromConnection(String callId, ParcelableConference parcelableConference) {
        for (IConnectionServiceAdapter adapter : mAdapters) {
            try {
                adapter.addConferenceCallFromConnection(callId, parcelableConference,
                        Log.getExternalSession());
            } catch (RemoteException ignored) {
            }
        }
    }

    /**
     * Retrieves a list of remote connection services usable to place calls.
     */
+23 −0
Original line number Diff line number Diff line
@@ -79,6 +79,8 @@ final class ConnectionServiceAdapterServant {
    private static final int MSG_HANDLE_CREATE_CONFERENCE_COMPLETE = 37;
    private static final int MSG_SET_CALL_DIRECTION = 38;
    private static final int MSG_QUERY_LOCATION = 39;
    private static final int MSG_ADD_CONFERENCE_CALL_FROM_CONN = 40;


    private final IConnectionServiceAdapter mDelegate;

@@ -178,6 +180,17 @@ final class ConnectionServiceAdapterServant {
                    }
                    break;
                }
                case MSG_ADD_CONFERENCE_CALL_FROM_CONN: {
                    SomeArgs args = (SomeArgs) msg.obj;
                    try {
                        mDelegate.addConferenceCallFromConnection(
                                (String) args.arg1, (ParcelableConference) args.arg2,
                                null /*Session.Info*/);
                    } finally {
                        args.recycle();
                    }
                    break;
                }
                case MSG_REMOVE_CALL:
                    mDelegate.removeCall((String) msg.obj,
                            null /*Session.Info*/);
@@ -501,6 +514,16 @@ final class ConnectionServiceAdapterServant {
            mHandler.obtainMessage(MSG_ADD_CONFERENCE_CALL, args).sendToTarget();
        }

        @Override
        public void addConferenceCallFromConnection(String callId,
                ParcelableConference parcelableConference,
                Session.Info sessionInfo) {
            SomeArgs args = SomeArgs.obtain();
            args.arg1 = callId;
            args.arg2 = parcelableConference;
            mHandler.obtainMessage(MSG_ADD_CONFERENCE_CALL_FROM_CONN, args).sendToTarget();
        }

        @Override
        public void removeCall(String connectionId,
                Session.Info sessionInfo) {
+4 −0
Original line number Diff line number Diff line
@@ -230,6 +230,10 @@ final class RemoteConnectionService {
        @Override
        public void onConnectionServiceFocusReleased(Session.Info sessionInfo) {}

        @Override
        public void addConferenceCallFromConnection(
                final String callId, ParcelableConference parcel, Session.Info sessionInfo) {}

        @Override
        public void addConferenceCall(
                final String callId, ParcelableConference parcel, Session.Info sessionInfo) {
Loading