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

Commit bebb17b6 authored by Linux Build Service Account's avatar Linux Build Service Account Committed by Gerrit - the friendly Code Review server
Browse files

Merge "IMS-VT: Enable Video conferencing."

parents c03505e7 643c5ba6
Loading
Loading
Loading
Loading
+48 −0
Original line number Original line Diff line number Diff line
@@ -17,10 +17,12 @@
package android.telecom;
package android.telecom;


import android.annotation.SystemApi;
import android.annotation.SystemApi;
import android.telecom.Connection.VideoProvider;


import java.util.ArrayList;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Collections;
import java.util.List;
import java.util.List;
import java.util.Locale;
import java.util.Set;
import java.util.Set;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.CopyOnWriteArraySet;
import java.util.concurrent.CopyOnWriteArraySet;
@@ -42,6 +44,8 @@ public abstract class Conference implements IConferenceable {
                Conference conference, List<Connection> conferenceableConnections) {}
                Conference conference, List<Connection> conferenceableConnections) {}
        public void onDestroyed(Conference conference) {}
        public void onDestroyed(Conference conference) {}
        public void onCapabilitiesChanged(Conference conference, int capabilities) {}
        public void onCapabilitiesChanged(Conference conference, int capabilities) {}
        public void onVideoStateChanged(Conference c, int videoState) { }
        public void onVideoProviderChanged(Conference c, Connection.VideoProvider videoProvider) {}
    }
    }


    private final Set<Listener> mListeners = new CopyOnWriteArraySet<>();
    private final Set<Listener> mListeners = new CopyOnWriteArraySet<>();
@@ -122,6 +126,22 @@ public abstract class Conference implements IConferenceable {
        return mAudioState;
        return mAudioState;
    }
    }


    /**
     * Returns VideoProvider of the primary call. This can be null.
     *  @hide
     */
    public VideoProvider getVideoProvider() {
        return null;
    }

    /**
     * Returns video state of the primary call.
     *  @hide
     */
    public int getVideoState() {
        return VideoProfile.VideoState.AUDIO_ONLY;
    }

    /**
    /**
     * Invoked when the Conference and all it's {@link Connection}s should be disconnected.
     * Invoked when the Conference and all it's {@link Connection}s should be disconnected.
     */
     */
@@ -246,6 +266,7 @@ public abstract class Conference implements IConferenceable {
     * @return True if the connection was successfully added.
     * @return True if the connection was successfully added.
     */
     */
    public final boolean addConnection(Connection connection) {
    public final boolean addConnection(Connection connection) {
        Log.d(this, "Connection=%s, connection=", connection);
        if (connection != null && !mChildConnections.contains(connection)) {
        if (connection != null && !mChildConnections.contains(connection)) {
            if (connection.setConference(this)) {
            if (connection.setConference(this)) {
                mChildConnections.add(connection);
                mChildConnections.add(connection);
@@ -292,6 +313,22 @@ public abstract class Conference implements IConferenceable {
        fireOnConferenceableConnectionsChanged();
        fireOnConferenceableConnectionsChanged();
    }
    }


    public final void setVideoState(Connection c, int videoState) {
        Log.d(this, "setVideoState Conference: %s Connection: %s VideoState: %s",
                this, c, videoState);
        for (Listener l : mListeners) {
            l.onVideoStateChanged(this, videoState);
        }
    }

    public final void setVideoProvider(Connection c, Connection.VideoProvider videoProvider) {
        Log.d(this, "setVideoProvider Conference: %s Connection: %s VideoState: %s",
                this, c, videoProvider);
        for (Listener l : mListeners) {
            l.onVideoProviderChanged(this, videoProvider);
        }
    }

    private final void fireOnConferenceableConnectionsChanged() {
    private final void fireOnConferenceableConnectionsChanged() {
        for (Listener l : mListeners) {
        for (Listener l : mListeners) {
            l.onConferenceableConnectionsChanged(this, getConferenceableConnections());
            l.onConferenceableConnectionsChanged(this, getConferenceableConnections());
@@ -401,4 +438,15 @@ public abstract class Conference implements IConferenceable {
        }
        }
        mConferenceableConnections.clear();
        mConferenceableConnections.clear();
    }
    }

    @Override
    public String toString() {
        return String.format(Locale.US,
                "[State: %s,Capabilites: %s, VideoState: %s, VideoProvider: %s, ThisObject %s]",
                Connection.stateToString(mState),
                PhoneCapabilities.toString(mCapabilities),
                getVideoState(),
                getVideoProvider(),
                super.toString());
    }
}
}
+26 −1
Original line number Original line Diff line number Diff line
@@ -437,6 +437,21 @@ public abstract class ConnectionService extends Service {
                    PhoneCapabilities.toString(capabilities));
                    PhoneCapabilities.toString(capabilities));
            mAdapter.setCallCapabilities(id, capabilities);
            mAdapter.setCallCapabilities(id, capabilities);
        }
        }

        @Override
        public void onVideoStateChanged(Conference c, int videoState) {
            String id = mIdByConference.get(c);
            Log.d(this, "onVideoStateChanged set video state %d", videoState);
            mAdapter.setVideoState(id, videoState);
        }

        @Override
        public void onVideoProviderChanged(Conference c, Connection.VideoProvider videoProvider) {
            String id = mIdByConference.get(c);
            Log.d(this, "onVideoProviderChanged: Connection: %s, VideoProvider: %s", c,
                    videoProvider);
            mAdapter.setVideoProvider(id, videoProvider);
        }
    };
    };


    private final Connection.Listener mConnectionListener = new Connection.Listener() {
    private final Connection.Listener mConnectionListener = new Connection.Listener() {
@@ -539,6 +554,8 @@ public abstract class ConnectionService extends Service {
        @Override
        @Override
        public void onVideoProviderChanged(Connection c, Connection.VideoProvider videoProvider) {
        public void onVideoProviderChanged(Connection c, Connection.VideoProvider videoProvider) {
            String id = mIdByConnection.get(c);
            String id = mIdByConnection.get(c);
            Log.d(this, "onVideoProviderChanged: Connection: %s, VideoProvider: %s", c,
                    videoProvider);
            mAdapter.setVideoProvider(id, videoProvider);
            mAdapter.setVideoProvider(id, videoProvider);
        }
        }


@@ -939,6 +956,8 @@ public abstract class ConnectionService extends Service {
     * @param conference The new conference object.
     * @param conference The new conference object.
     */
     */
    public final void addConference(Conference conference) {
    public final void addConference(Conference conference) {
        Log.d(this, "addConference: conference=%s", conference);

        String id = addConferenceInternal(conference);
        String id = addConferenceInternal(conference);
        if (id != null) {
        if (id != null) {
            List<String> connectionIds = new ArrayList<>(2);
            List<String> connectionIds = new ArrayList<>(2);
@@ -951,8 +970,14 @@ public abstract class ConnectionService extends Service {
                    conference.getPhoneAccountHandle(),
                    conference.getPhoneAccountHandle(),
                    conference.getState(),
                    conference.getState(),
                    conference.getCapabilities(),
                    conference.getCapabilities(),
                    connectionIds);
                    connectionIds,
                    conference.getVideoProvider() == null ?
                            null : conference.getVideoProvider().getInterface(),
                    conference.getVideoState()
                    );
            mAdapter.addConferenceCall(id, parcelableConference);
            mAdapter.addConferenceCall(id, parcelableConference);
            mAdapter.setVideoProvider(id, conference.getVideoProvider());
            mAdapter.setVideoState(id, conference.getVideoState());


            // Go through any child calls and set the parent.
            // Go through any child calls and set the parent.
            for (Connection connection : conference.getConnections()) {
            for (Connection connection : conference.getConnections()) {
+30 −2
Original line number Original line Diff line number Diff line
@@ -22,6 +22,8 @@ import android.os.Parcelable;
import java.util.ArrayList;
import java.util.ArrayList;
import java.util.List;
import java.util.List;


import com.android.internal.telecom.IVideoProvider;

/**
/**
 * A parcelable representation of a conference connection.
 * A parcelable representation of a conference connection.
 * @hide
 * @hide
@@ -32,16 +34,23 @@ public final class ParcelableConference implements Parcelable {
    private int mState;
    private int mState;
    private int mCapabilities;
    private int mCapabilities;
    private List<String> mConnectionIds;
    private List<String> mConnectionIds;
    private final IVideoProvider mVideoProvider;
    private final int mVideoState;



    public ParcelableConference(
    public ParcelableConference(
            PhoneAccountHandle phoneAccount,
            PhoneAccountHandle phoneAccount,
            int state,
            int state,
            int capabilities,
            int capabilities,
            List<String> connectionIds) {
            List<String> connectionIds,
            IVideoProvider videoProvider,
            int videoState) {
        mPhoneAccount = phoneAccount;
        mPhoneAccount = phoneAccount;
        mState = state;
        mState = state;
        mCapabilities = capabilities;
        mCapabilities = capabilities;
        mConnectionIds = connectionIds;
        mConnectionIds = connectionIds;
        mVideoProvider = videoProvider;
        mVideoState = videoState;
    }
    }


    @Override
    @Override
@@ -55,6 +64,10 @@ public final class ParcelableConference implements Parcelable {
                .append(PhoneCapabilities.toString(mCapabilities))
                .append(PhoneCapabilities.toString(mCapabilities))
                .append(", children: ")
                .append(", children: ")
                .append(mConnectionIds)
                .append(mConnectionIds)
                .append(", VideoState: ")
                .append(mVideoState)
                .append(", VideoProvider: ")
                .append(mVideoProvider)
                .toString();
                .toString();
    }
    }


@@ -74,6 +87,14 @@ public final class ParcelableConference implements Parcelable {
        return mConnectionIds;
        return mConnectionIds;
    }
    }


    public IVideoProvider getVideoProvider() {
        return mVideoProvider;
    }

    public int getVideoState() {
        return mVideoState;
    }

    public static final Parcelable.Creator<ParcelableConference> CREATOR =
    public static final Parcelable.Creator<ParcelableConference> CREATOR =
            new Parcelable.Creator<ParcelableConference> () {
            new Parcelable.Creator<ParcelableConference> () {
        @Override
        @Override
@@ -84,8 +105,12 @@ public final class ParcelableConference implements Parcelable {
            int capabilities = source.readInt();
            int capabilities = source.readInt();
            List<String> connectionIds = new ArrayList<>(2);
            List<String> connectionIds = new ArrayList<>(2);
            source.readList(connectionIds, classLoader);
            source.readList(connectionIds, classLoader);
            IVideoProvider videoCallProvider =
                    IVideoProvider.Stub.asInterface(source.readStrongBinder());
            int videoState = source.readInt();


            return new ParcelableConference(phoneAccount, state, capabilities, connectionIds);
            return new ParcelableConference(phoneAccount, state, capabilities, connectionIds,
                    videoCallProvider, videoState);
        }
        }


        @Override
        @Override
@@ -107,5 +132,8 @@ public final class ParcelableConference implements Parcelable {
        destination.writeInt(mState);
        destination.writeInt(mState);
        destination.writeInt(mCapabilities);
        destination.writeInt(mCapabilities);
        destination.writeList(mConnectionIds);
        destination.writeList(mConnectionIds);
        destination.writeStrongBinder(
                mVideoProvider != null ? mVideoProvider.asBinder() : null);
        destination.writeInt(mVideoState);
    }
    }
}
}