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

Commit 0fbe6321 authored by Santos Cordon's avatar Santos Cordon
Browse files

Update telecomm to use new Conference call APIs.

Bug:16844332
Bug:16449372
Change-Id: I897df73b3e552c498ef36211e03970db7e0d303e
parent a0231634
Loading
Loading
Loading
Loading
+8 −34
Original line number Diff line number Diff line
@@ -73,8 +73,6 @@ final class Call implements CreateConnectionResponse {
        void onRequestingRingback(Call call, boolean requestingRingback);
        void onPostDialWait(Call call, String remaining);
        void onCallCapabilitiesChanged(Call call);
        void onExpiredConferenceCall(Call call);
        void onConfirmedConferenceCall(Call call);
        void onParentChanged(Call call);
        void onChildrenChanged(Call call);
        void onCannedSmsResponsesLoaded(Call call);
@@ -110,10 +108,6 @@ final class Call implements CreateConnectionResponse {
        @Override
        public void onCallCapabilitiesChanged(Call call) {}
        @Override
        public void onExpiredConferenceCall(Call call) {}
        @Override
        public void onConfirmedConferenceCall(Call call) {}
        @Override
        public void onParentChanged(Call call) {}
        @Override
        public void onChildrenChanged(Call call) {}
@@ -346,16 +340,8 @@ final class Call implements CreateConnectionResponse {
    }

    int getState() {
        if (mIsConference) {
            if (!mChildCalls.isEmpty()) {
                // If we have child calls, just return the child call.
                return mChildCalls.get(0).getState();
            }
            return CallState.ACTIVE;
        } else {
        return mState;
    }
    }

    /**
     * Sets the call state. Although there exists the notion of appropriate state transitions
@@ -855,27 +841,11 @@ final class Call implements CreateConnectionResponse {
        mConnectionService.onPhoneAccountClicked(this);
    }

    void conferenceInto(Call conferenceCall) {
    void conferenceWith(Call otherCall) {
        if (mConnectionService == null) {
            Log.w(this, "conference requested on a call without a connection service.");
        } else {
            mConnectionService.conference(conferenceCall, this);
        }
    }

    void expireConference() {
        // The conference call expired before we got a confirmation of the conference from the
        // connection service...so start shutting down.
        clearConnectionService();
        for (Listener l : mListeners) {
            l.onExpiredConferenceCall(this);
        }
    }

    void confirmConference() {
        Log.v(this, "confirming Conf call %s", mListeners);
        for (Listener l : mListeners) {
            l.onConfirmedConferenceCall(this);
            mConnectionService.conference(this, otherCall);
        }
    }

@@ -888,6 +858,10 @@ final class Call implements CreateConnectionResponse {
            Log.e(this, new Exception(), "setting the parent to self");
            return;
        }
        if (parentCall == mParentCall) {
            // nothing to do
            return;
        }
        Preconditions.checkState(parentCall == null || mParentCall == null);

        Call oldParent = mParentCall;
@@ -1214,7 +1188,7 @@ final class Call implements CreateConnectionResponse {
        }
    }

    private int getStateFromConnectionState(int state) {
    static int getStateFromConnectionState(int state) {
        switch (state) {
            case Connection.STATE_INITIALIZING:
                return CallState.CONNECTING;
+5 −1
Original line number Diff line number Diff line
@@ -78,7 +78,7 @@ class CallIdMapper {
        if (objId instanceof String) {
            callId = (String) objId;
        }
        if (!isValidCallId(callId)) {
        if (!isValidCallId(callId) && !isValidConferenceId(callId)) {
            return null;
        }

@@ -94,6 +94,10 @@ class CallIdMapper {
        return callId != null && callId.startsWith(mCallIdPrefix);
    }

    boolean isValidConferenceId(String callId) {
        return callId != null;
    }

    String getNewId() {
        sIdCount++;
        return mCallIdPrefix + sIdCount;
+23 −24
Original line number Diff line number Diff line
@@ -21,6 +21,7 @@ import android.os.Bundle;
import android.telecomm.AudioState;
import android.telecomm.CallState;
import android.telecomm.GatewayInfo;
import android.telecomm.ParcelableConference;
import android.telecomm.PhoneAccountHandle;
import android.telephony.DisconnectCause;

@@ -187,20 +188,6 @@ public final class CallsManager extends Call.ListenerBase {
        mInCallController.onPostDialWait(call, remaining);
    }

    @Override
    public void onExpiredConferenceCall(Call call) {
        call.removeListener(this);
    }

    @Override
    public void onConfirmedConferenceCall(Call call) {
        addCall(call);
        Log.v(this, "confirming Conf call %s", call);
        for (CallsManagerListener listener : mListeners) {
            listener.onIsConferencedChanged(call);
        }
    }

    @Override
    public void onParentChanged(Call call) {
        for (CallsManagerListener listener : mListeners) {
@@ -417,16 +404,7 @@ public final class CallsManager extends Call.ListenerBase {
     * @param otherCall The other call to conference with.
     */
    void conference(Call call, Call otherCall) {
        Call conferenceCall = new Call(
                mConnectionServiceRepository,
                null /* handle */,
                null /* gatewayInfo */,
                null /* connectionManagerPhoneAccount */,
                null /* targetPhoneAccount */,
                false /* isIncoming */,
                true /* isConference */);
        conferenceCall.addListener(this);
        call.conferenceInto(conferenceCall);
        call.conferenceWith(otherCall);
    }

    /**
@@ -751,6 +729,27 @@ public final class CallsManager extends Call.ListenerBase {
        return null;
    }

    Call createConferenceCall(
            PhoneAccountHandle phoneAccount,
            ParcelableConference parcelableConference) {
        Call call = new Call(
                mConnectionServiceRepository,
                null /* handle */,
                null /* gatewayInfo */,
                null /* connectionManagerPhoneAccount */,
                phoneAccount,
                false /* isIncoming */,
                true /* isConference */);

        setCallState(call, Call.getStateFromConnectionState(parcelableConference.getState()));
        call.setCallCapabilities(parcelableConference.getCapabilities());

        // TODO: Move this to be a part of addCall()
        call.addListener(this);
        addCall(call);
        return call;
    }

    /**
     * Adds the specified call to the main list of live calls.
     *
+51 −40
Original line number Diff line number Diff line
@@ -28,6 +28,8 @@ import android.telecomm.AudioState;
import android.telecomm.ConnectionRequest;
import android.telecomm.ConnectionService;
import android.telecomm.GatewayInfo;

import android.telecomm.ParcelableConference;
import android.telecomm.ParcelableConnection;
import android.telecomm.PhoneAccount;
import android.telecomm.PhoneAccountHandle;
@@ -163,6 +165,7 @@ final class ConnectionServiceWrapper extends ServiceBinder<IConnectionService> {
                        call = mCallIdMapper.getCall(args.arg1);
                        String disconnectMessage = (String) args.arg2;
                        int disconnectCause = args.argi1;
                        Log.d(this, "disconnect call %s %s", args.arg1, call);
                        if (call != null) {
                            mCallsManager.markCallAsDisconnected(call, disconnectCause,
                                    disconnectMessage);
@@ -208,16 +211,11 @@ final class ConnectionServiceWrapper extends ServiceBinder<IConnectionService> {
                        if (childCall != null) {
                            String conferenceCallId = (String) args.arg2;
                            if (conferenceCallId == null) {
                                Log.d(this, "unsetting parent: %s", args.arg1);
                                childCall.setParentCall(null);
                            } else {
                                Call conferenceCall = mCallIdMapper.getCall(conferenceCallId);
                                if (conferenceCall != null &&
                                        !mPendingConferenceCalls.contains(conferenceCall)) {
                                childCall.setParentCall(conferenceCall);
                                } else {
                                    //Log.w(this, "setIsConferenced, unknown conference id %s",
                                    //        conferenceCallId);
                                }
                            }
                        } else {
                            //Log.w(this, "setIsConferenced, unknown call id: %s", args.arg1);
@@ -228,12 +226,32 @@ final class ConnectionServiceWrapper extends ServiceBinder<IConnectionService> {
                    break;
                }
                case MSG_ADD_CONFERENCE_CALL: {
                    Call conferenceCall = mCallIdMapper.getCall(msg.obj);
                    if (mPendingConferenceCalls.remove(conferenceCall)) {
                        Log.v(this, "confirming conf call %s", conferenceCall);
                        conferenceCall.confirmConference();
                    } else {
                        //Log.w(this, "addConference, unknown call id: %s", callId);
                    SomeArgs args = (SomeArgs) msg.obj;
                    try {
                        String id = (String) args.arg1;
                        if (mCallIdMapper.getCall(id) != null) {
                            Log.w(this, "Attempting to add a conference call using an existing " +
                                    "call id %s", id);
                            break;
                        }
                        ParcelableConference parcelableConference =
                                (ParcelableConference) args.arg2;
                        // need to create a new Call
                        Call conferenceCall = mCallsManager.createConferenceCall(
                                null, parcelableConference);
                        mCallIdMapper.addCall(conferenceCall, id);
                        conferenceCall.setConnectionService(ConnectionServiceWrapper.this);

                        Log.d(this, "adding children to conference");
                        for (String callId : parcelableConference.getConnectionIds()) {
                            Call childCall = mCallIdMapper.getCall(callId);
                            Log.d(this, "found child: %s", callId);
                            if (childCall != null) {
                                childCall.setParentCall(conferenceCall);
                            }
                        }
                    } finally {
                        args.recycle();
                    }
                    break;
                }
@@ -421,7 +439,7 @@ final class ConnectionServiceWrapper extends ServiceBinder<IConnectionService> {
        @Override
        public void setActive(String callId) {
            logIncoming("setActive %s", callId);
            if (mCallIdMapper.isValidCallId(callId)) {
            if (mCallIdMapper.isValidCallId(callId) || mCallIdMapper.isValidConferenceId(callId)) {
                mHandler.obtainMessage(MSG_SET_ACTIVE, callId).sendToTarget();
            }
        }
@@ -457,7 +475,8 @@ final class ConnectionServiceWrapper extends ServiceBinder<IConnectionService> {
        public void setDisconnected(
                String callId, int disconnectCause, String disconnectMessage) {
            logIncoming("setDisconnected %s %d %s", callId, disconnectCause, disconnectMessage);
            if (mCallIdMapper.isValidCallId(callId)) {
            if (mCallIdMapper.isValidCallId(callId) || mCallIdMapper.isValidConferenceId(callId)) {
                Log.d(this, "disconnect call %s", callId);
                SomeArgs args = SomeArgs.obtain();
                args.arg1 = callId;
                args.arg2 = disconnectMessage;
@@ -469,7 +488,7 @@ final class ConnectionServiceWrapper extends ServiceBinder<IConnectionService> {
        @Override
        public void setOnHold(String callId) {
            logIncoming("setOnHold %s", callId);
            if (mCallIdMapper.isValidCallId(callId)) {
            if (mCallIdMapper.isValidCallId(callId) || mCallIdMapper.isValidConferenceId(callId)) {
                mHandler.obtainMessage(MSG_SET_ON_HOLD, callId).sendToTarget();
            }
        }
@@ -486,8 +505,9 @@ final class ConnectionServiceWrapper extends ServiceBinder<IConnectionService> {
        @Override
        public void removeCall(String callId) {
            logIncoming("removeCall %s", callId);
            if (mCallIdMapper.isValidCallId(callId)) {
            if (mCallIdMapper.isValidCallId(callId) || mCallIdMapper.isValidConferenceId(callId)) {
                mHandler.obtainMessage(MSG_REMOVE_CALL, callId).sendToTarget();
                mHandler.obtainMessage(MSG_REMOVE_CALL, callId);
            }
        }

@@ -504,7 +524,7 @@ final class ConnectionServiceWrapper extends ServiceBinder<IConnectionService> {
        public void setIsConferenced(String callId, String conferenceCallId) {
            logIncoming("setIsConferenced %s %s", callId, conferenceCallId);
            if (mCallIdMapper.isValidCallId(callId) &&
                    mCallIdMapper.isValidCallId(conferenceCallId)) {
                    mCallIdMapper.isValidConferenceId(conferenceCallId)) {
                SomeArgs args = SomeArgs.obtain();
                args.arg1 = callId;
                args.arg2 = conferenceCallId;
@@ -513,11 +533,14 @@ final class ConnectionServiceWrapper extends ServiceBinder<IConnectionService> {
        }

        @Override
        public void addConferenceCall(String callId) {
            logIncoming("addConferenceCall %s", callId);
            if (mCallIdMapper.isValidCallId(callId)) {
                mHandler.obtainMessage(MSG_ADD_CONFERENCE_CALL, callId).sendToTarget();
            }
        public void addConferenceCall(String callId, ParcelableConference parcelableConference) {
            logIncoming("addConferenceCall %s %s", callId, parcelableConference);
            // We do not check call Ids here because we do not yet know the call ID for new
            // conference calls.
            SomeArgs args = SomeArgs.obtain();
            args.arg1 = callId;
            args.arg2 = parcelableConference;
            mHandler.obtainMessage(MSG_ADD_CONFERENCE_CALL, args).sendToTarget();
        }

        @Override
@@ -874,25 +897,13 @@ final class ConnectionServiceWrapper extends ServiceBinder<IConnectionService> {
        }
    }

    void conference(final Call conferenceCall, Call call) {
        final String conferenceId = mCallIdMapper.getCallId(call);
    void conference(final Call call, Call otherCall) {
        final String callId = mCallIdMapper.getCallId(call);
        if (conferenceId != null && callId != null &&
                isServiceValid("conference")) {
        final String otherCallId = mCallIdMapper.getCallId(otherCall);
        if (callId != null && otherCallId != null && isServiceValid("conference")) {
            try {
                conferenceCall.setConnectionService(this);
                mPendingConferenceCalls.add(conferenceCall);
                mHandler.postDelayed(new Runnable() {
                    @Override public void run() {
                        if (mPendingConferenceCalls.remove(conferenceCall)) {
                            conferenceCall.expireConference();
                            Log.i(this, "Conference call expired: %s", conferenceCall);
                        }
                    }
                }, Timeouts.getConferenceCallExpireMillis());

                logOutgoing("conference %s %s", conferenceId, callId);
                mServiceInterface.conference(conferenceId, callId);
                logOutgoing("conference %s %s", callId, otherCallId);
                mServiceInterface.conference(callId, otherCallId);
            } catch (RemoteException ignored) {
            }
        }
+2 −2
Original line number Diff line number Diff line
@@ -195,7 +195,7 @@ public final class InCallController extends CallsManagerListenerBase {

    @Override
    public void onIsConferencedChanged(Call call) {
        Log.v(this, "onIsConferencedChanged %s", call);
        Log.d(this, "onIsConferencedChanged %s", call);
        updateCall(call);
    }

@@ -292,7 +292,7 @@ public final class InCallController extends CallsManagerListenerBase {
        if (mInCallService != null) {
            try {
                ParcelableCall parcelableCall = toParcelableCall(call);
                Log.v(this, "updateCall %s ==> %s", call, parcelableCall);
                Log.d(this, "updateCall %s ==> %s", call, parcelableCall);
                mInCallService.updateCall(parcelableCall);
            } catch (RemoteException ignored) {
            }
Loading