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

Commit d7b4b812 authored by Etan Cohen's avatar Etan Cohen
Browse files

Merge commit '75958420' into merge2

Change-Id: I7e11e98e6d59562374195a8761d64a79dc0268e8
parents 3b8efc3e 75958420
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -933,7 +933,8 @@ public final class Call {
                    Collections.unmodifiableList(parcelableCall.getCannedSmsResponses());
        }

        boolean videoCallChanged = !Objects.equals(mVideoCall, parcelableCall.getVideoCall());
        boolean videoCallChanged = parcelableCall.isVideoCallProviderChanged() &&
                !Objects.equals(mVideoCall, parcelableCall.getVideoCall());
        if (videoCallChanged) {
            mVideoCall = parcelableCall.getVideoCall();
        }
+73 −28
Original line number Diff line number Diff line
@@ -28,6 +28,7 @@ import android.view.Surface;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
@@ -402,7 +403,7 @@ public abstract class Connection implements Conferenceable {
         */
        public static final int SESSION_MODIFY_REQUEST_REJECTED_BY_REMOTE = 5;

        private static final int MSG_SET_VIDEO_CALLBACK = 1;
        private static final int MSG_ADD_VIDEO_CALLBACK = 1;
        private static final int MSG_SET_CAMERA = 2;
        private static final int MSG_SET_PREVIEW_SURFACE = 3;
        private static final int MSG_SET_DISPLAY_SURFACE = 4;
@@ -413,11 +414,16 @@ public abstract class Connection implements Conferenceable {
        private static final int MSG_REQUEST_CAMERA_CAPABILITIES = 9;
        private static final int MSG_REQUEST_CONNECTION_DATA_USAGE = 10;
        private static final int MSG_SET_PAUSE_IMAGE = 11;
        private static final int MSG_REMOVE_VIDEO_CALLBACK = 12;

        private final VideoProvider.VideoProviderHandler
                mMessageHandler = new VideoProvider.VideoProviderHandler();
        private final VideoProvider.VideoProviderBinder mBinder;
        private IVideoCallback mVideoCallback;

        /**
         * Stores a list of the video callbacks, keyed by IBinder.
         */
        private HashMap<IBinder, IVideoCallback> mVideoCallbacks = new HashMap<>();

        /**
         * Default handler used to consolidate binder method calls onto a single thread.
@@ -426,9 +432,29 @@ public abstract class Connection implements Conferenceable {
            @Override
            public void handleMessage(Message msg) {
                switch (msg.what) {
                    case MSG_SET_VIDEO_CALLBACK:
                        mVideoCallback = IVideoCallback.Stub.asInterface((IBinder) msg.obj);
                    case MSG_ADD_VIDEO_CALLBACK: {
                        IBinder binder = (IBinder) msg.obj;
                        IVideoCallback callback = IVideoCallback.Stub
                                .asInterface((IBinder) msg.obj);
                        if (mVideoCallbacks.containsKey(binder)) {
                            Log.i(this, "addVideoProvider - skipped; already present.");
                            break;
                        }
                        mVideoCallbacks.put(binder, callback);
                        Log.i(this, "addVideoProvider  "+ mVideoCallbacks.size());
                        break;
                    }
                    case MSG_REMOVE_VIDEO_CALLBACK: {
                        IBinder binder = (IBinder) msg.obj;
                        IVideoCallback callback = IVideoCallback.Stub
                                .asInterface((IBinder) msg.obj);
                        if (!mVideoCallbacks.containsKey(binder)) {
                            Log.i(this, "removeVideoProvider - skipped; not present.");
                            break;
                        }
                        mVideoCallbacks.remove(binder);
                        break;
                    }
                    case MSG_SET_CAMERA:
                        onSetCamera((String) msg.obj);
                        break;
@@ -469,9 +495,14 @@ public abstract class Connection implements Conferenceable {
         * IVideoProvider stub implementation.
         */
        private final class VideoProviderBinder extends IVideoProvider.Stub {
            public void setVideoCallback(IBinder videoCallbackBinder) {
            public void addVideoCallback(IBinder videoCallbackBinder) {
                mMessageHandler.obtainMessage(
                        MSG_SET_VIDEO_CALLBACK, videoCallbackBinder).sendToTarget();
                        MSG_ADD_VIDEO_CALLBACK, videoCallbackBinder).sendToTarget();
            }

            public void removeVideoCallback(IBinder videoCallbackBinder) {
                mMessageHandler.obtainMessage(
                        MSG_REMOVE_VIDEO_CALLBACK, videoCallbackBinder).sendToTarget();
            }

            public void setCamera(String cameraId) {
@@ -609,21 +640,23 @@ public abstract class Connection implements Conferenceable {
        public abstract void onSetPauseImage(String uri);

        /**
         * Invokes callback method defined in In-Call UI.
         * Invokes callback method defined in listening {@link InCallService} implementations.
         *
         * @param videoProfile The requested video connection profile.
         */
        public void receiveSessionModifyRequest(VideoProfile videoProfile) {
            if (mVideoCallback != null) {
            if (mVideoCallbacks != null) {
                try {
                    mVideoCallback.receiveSessionModifyRequest(videoProfile);
                    for (IVideoCallback callback : mVideoCallbacks.values()) {
                        callback.receiveSessionModifyRequest(videoProfile);
                    }
                } catch (RemoteException ignored) {
                }
            }
        }

        /**
         * Invokes callback method defined in In-Call UI.
         * Invokes callback method defined in listening {@link InCallService} implementations.
         *
         * @param status Status of the session modify request.  Valid values are
         *               {@link VideoProvider#SESSION_MODIFY_REQUEST_SUCCESS},
@@ -634,17 +667,19 @@ public abstract class Connection implements Conferenceable {
         */
        public void receiveSessionModifyResponse(int status,
                VideoProfile requestedProfile, VideoProfile responseProfile) {
            if (mVideoCallback != null) {
            if (mVideoCallbacks != null) {
                try {
                    mVideoCallback.receiveSessionModifyResponse(
                            status, requestedProfile, responseProfile);
                    for (IVideoCallback callback : mVideoCallbacks.values()) {
                        callback.receiveSessionModifyResponse(status, requestedProfile,
                                responseProfile);
                    }
                } catch (RemoteException ignored) {
                }
            }
        }

        /**
         * Invokes callback method defined in In-Call UI.
         * Invokes callback method defined in listening {@link InCallService} implementations.
         *
         * Valid values are: {@link VideoProvider#SESSION_EVENT_RX_PAUSE},
         * {@link VideoProvider#SESSION_EVENT_RX_RESUME},
@@ -654,66 +689,76 @@ public abstract class Connection implements Conferenceable {
         * @param event The event.
         */
        public void handleCallSessionEvent(int event) {
            if (mVideoCallback != null) {
            if (mVideoCallbacks != null) {
                try {
                    mVideoCallback.handleCallSessionEvent(event);
                    for (IVideoCallback callback : mVideoCallbacks.values()) {
                        callback.handleCallSessionEvent(event);
                    }
                } catch (RemoteException ignored) {
                }
            }
        }

        /**
         * Invokes callback method defined in In-Call UI.
         * Invokes callback method defined in listening {@link InCallService} implementations.
         *
         * @param width  The updated peer video width.
         * @param height The updated peer video height.
         */
        public void changePeerDimensions(int width, int height) {
            if (mVideoCallback != null) {
            if (mVideoCallbacks != null) {
                try {
                    mVideoCallback.changePeerDimensions(width, height);
                    for (IVideoCallback callback : mVideoCallbacks.values()) {
                        callback.changePeerDimensions(width, height);
                    }
                } catch (RemoteException ignored) {
                }
            }
        }

        /**
         * Invokes callback method defined in In-Call UI.
         * Invokes callback method defined in listening {@link InCallService} implementations.
         *
         * @param dataUsage The updated data usage.
         */
        public void changeCallDataUsage(long dataUsage) {
            if (mVideoCallback != null) {
            if (mVideoCallbacks != null) {
                try {
                    mVideoCallback.changeCallDataUsage(dataUsage);
                    for (IVideoCallback callback : mVideoCallbacks.values()) {
                        callback.changeCallDataUsage(dataUsage);
                    }
                } catch (RemoteException ignored) {
                }
            }
        }

        /**
         * Invokes callback method defined in In-Call UI.
         * Invokes callback method defined in listening {@link InCallService} implementations.
         *
         * @param cameraCapabilities The changed camera capabilities.
         */
        public void changeCameraCapabilities(CameraCapabilities cameraCapabilities) {
            if (mVideoCallback != null) {
            if (mVideoCallbacks != null) {
                try {
                    mVideoCallback.changeCameraCapabilities(cameraCapabilities);
                    for (IVideoCallback callback : mVideoCallbacks.values()) {
                        callback.changeCameraCapabilities(cameraCapabilities);
                    }
                } catch (RemoteException ignored) {
                }
            }
        }

        /**
         * Invokes callback method defined in In-Call UI.
         * Invokes callback method defined in listening {@link InCallService} implementations.
         *
         * @param videoQuality The updated video quality.
         */
        public void changeVideoQuality(int videoQuality) {
            if (mVideoCallback != null) {
            if (mVideoCallbacks != null) {
                try {
                    mVideoCallback.changeVideoQuality(videoQuality);
                    for (IVideoCallback callback : mVideoCallbacks.values()) {
                        callback.changeVideoQuality(videoQuality);
                    }
                } catch (RemoteException ignored) {
                }
            }
+5 −0
Original line number Diff line number Diff line
@@ -369,6 +369,11 @@ public abstract class InCallService extends Service {
         */
        public abstract void registerCallback(VideoCall.Callback callback);

        /**
         * Clears the video call listener set via {@link #setVideoCallListener(Listener)}.
         */
        public abstract void removeVideoCallListener();

        /**
         * Sets the camera to be used for video recording in a video call.
         *
+18 −0
Original line number Diff line number Diff line
@@ -46,6 +46,7 @@ public final class ParcelableCall implements Parcelable {
    private final int mCallerDisplayNamePresentation;
    private final GatewayInfo mGatewayInfo;
    private final PhoneAccountHandle mAccountHandle;
    private final boolean mIsVideoCallProviderChanged;
    private final IVideoProvider mVideoCallProvider;
    private InCallService.VideoCall mVideoCall;
    private final String mParentCallId;
@@ -69,6 +70,7 @@ public final class ParcelableCall implements Parcelable {
            int callerDisplayNamePresentation,
            GatewayInfo gatewayInfo,
            PhoneAccountHandle accountHandle,
            boolean isVideoCallProviderChanged,
            IVideoProvider videoCallProvider,
            String parentCallId,
            List<String> childCallIds,
@@ -89,6 +91,7 @@ public final class ParcelableCall implements Parcelable {
        mCallerDisplayNamePresentation = callerDisplayNamePresentation;
        mGatewayInfo = gatewayInfo;
        mAccountHandle = accountHandle;
        mIsVideoCallProviderChanged = isVideoCallProviderChanged;
        mVideoCallProvider = videoCallProvider;
        mParentCallId = parentCallId;
        mChildCallIds = childCallIds;
@@ -232,6 +235,18 @@ public final class ParcelableCall implements Parcelable {
        return mExtras;
    }

    /**
     * Indicates to the receiver of the {@link ParcelableCall} whether a change has occurred in the
     * {@link android.telecom.InCallService.VideoCall} associated with this call.  Since
     * {@link #getVideoCall()} creates a new {@link VideoCallImpl}, it is useful to know whether
     * the provider has changed (which can influence whether it is accessed).
     *
     * @return {@code true} if the video call changed, {@code false} otherwise.
     */
    public boolean isVideoCallProviderChanged() {
        return mIsVideoCallProviderChanged;
    }

    /** Responsible for creating ParcelableCall objects for deserialized Parcels. */
    public static final Parcelable.Creator<ParcelableCall> CREATOR =
            new Parcelable.Creator<ParcelableCall> () {
@@ -252,6 +267,7 @@ public final class ParcelableCall implements Parcelable {
            int callerDisplayNamePresentation = source.readInt();
            GatewayInfo gatewayInfo = source.readParcelable(classLoader);
            PhoneAccountHandle accountHandle = source.readParcelable(classLoader);
            boolean isVideoCallProviderChanged = source.readByte() == 1;
            IVideoProvider videoCallProvider =
                    IVideoProvider.Stub.asInterface(source.readStrongBinder());
            String parentCallId = source.readString();
@@ -276,6 +292,7 @@ public final class ParcelableCall implements Parcelable {
                    callerDisplayNamePresentation,
                    gatewayInfo,
                    accountHandle,
                    isVideoCallProviderChanged,
                    videoCallProvider,
                    parentCallId,
                    childCallIds,
@@ -313,6 +330,7 @@ public final class ParcelableCall implements Parcelable {
        destination.writeInt(mCallerDisplayNamePresentation);
        destination.writeParcelable(mGatewayInfo, 0);
        destination.writeParcelable(mAccountHandle, 0);
        destination.writeByte((byte) (mIsVideoCallProviderChanged ? 1 : 0));
        destination.writeStrongBinder(
                mVideoCallProvider != null ? mVideoCallProvider.asBinder() : null);
        destination.writeString(mParentCallId);
+9 −0
Original line number Diff line number Diff line
@@ -122,6 +122,11 @@ public final class Phone {
    final void internalRemoveCall(Call call) {
        mCallByTelecomCallId.remove(call.internalGetCallId());
        mCalls.remove(call);

        InCallService.VideoCall videoCall = call.getVideoCall();
        if (videoCall != null) {
            videoCall.removeVideoCallListener();
        }
        fireCallRemoved(call);
    }

@@ -167,6 +172,10 @@ public final class Phone {
     */
    final void destroy() {
        for (Call call : mCalls) {
            InCallService.VideoCall videoCall = call.getVideoCall();
            if (videoCall != null) {
                videoCall.removeVideoCallListener();
            }
            if (call.getState() != Call.STATE_DISCONNECTED) {
                call.internalSetDisconnected();
            }
Loading