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

Commit 14185765 authored by Andrew Lee's avatar Andrew Lee
Browse files

Move VideoCallProvider into ConnectionService.

Bug: 16494880
Change-Id: I0778197d06fcd219db4a1e1fa065e69026254a99
parent 0e31a13f
Loading
Loading
Loading
Loading
+23 −23
Original line number Diff line number Diff line
@@ -28613,7 +28613,7 @@ package android.telecomm {
    method public final android.telecomm.Connection getParentConnection();
    method public final int getState();
    method public final android.telecomm.StatusHints getStatusHints();
    method public final android.telecomm.VideoCallProvider getVideoCallProvider();
    method public final android.telecomm.ConnectionService.VideoCallProvider getVideoCallProvider();
    method public final int getVideoState();
    method public final boolean isConferenceConnection();
    method public final boolean isRequestingRingback();
@@ -28650,7 +28650,7 @@ package android.telecomm {
    method public final void setRinging();
    method public final void setSignal(android.os.Bundle);
    method public final void setStatusHints(android.telecomm.StatusHints);
    method public final void setVideoCallProvider(android.telecomm.VideoCallProvider);
    method public final void setVideoCallProvider(android.telecomm.ConnectionService.VideoCallProvider);
    method public final void setVideoState(int);
    method public final void startActivityFromInCall(android.app.PendingIntent);
    method public static java.lang.String stateToString(int);
@@ -28702,6 +28702,26 @@ package android.telecomm {
    method public abstract void onSuccess(android.telecomm.ConnectionRequest, CONNECTION);
  }
  public static abstract class ConnectionService.VideoCallProvider {
    ctor public ConnectionService.VideoCallProvider();
    method public void changeCallDataUsage(int);
    method public void changeCameraCapabilities(android.telecomm.CallCameraCapabilities);
    method public void changePeerDimensions(int, int);
    method public void handleCallSessionEvent(int);
    method public abstract void onRequestCallDataUsage();
    method public abstract void onRequestCameraCapabilities();
    method public abstract void onSendSessionModifyRequest(android.telecomm.VideoCallProfile);
    method public abstract void onSendSessionModifyResponse(android.telecomm.VideoCallProfile);
    method public abstract void onSetCamera(java.lang.String);
    method public abstract void onSetDeviceOrientation(int);
    method public abstract void onSetDisplaySurface(android.view.Surface);
    method public abstract void onSetPauseImage(java.lang.String);
    method public abstract void onSetPreviewSurface(android.view.Surface);
    method public abstract void onSetZoom(float);
    method public void receiveSessionModifyRequest(android.telecomm.VideoCallProfile);
    method public void receiveSessionModifyResponse(int, android.telecomm.VideoCallProfile, android.telecomm.VideoCallProfile);
  }
  public class GatewayInfo implements android.os.Parcelable {
    method public int describeContents();
    method public android.net.Uri getGatewayHandle();
@@ -28934,26 +28954,6 @@ package android.telecomm {
    field public static final int VIDEO_STATE_TX_ENABLED = 1; // 0x1
  }
  public abstract class VideoCallProvider {
    ctor public VideoCallProvider();
    method public void changeCallDataUsage(int);
    method public void changeCameraCapabilities(android.telecomm.CallCameraCapabilities);
    method public void changePeerDimensions(int, int);
    method public void handleCallSessionEvent(int);
    method public abstract void onRequestCallDataUsage();
    method public abstract void onRequestCameraCapabilities();
    method public abstract void onSendSessionModifyRequest(android.telecomm.VideoCallProfile);
    method public abstract void onSendSessionModifyResponse(android.telecomm.VideoCallProfile);
    method public abstract void onSetCamera(java.lang.String);
    method public abstract void onSetDeviceOrientation(int);
    method public abstract void onSetDisplaySurface(android.view.Surface);
    method public abstract void onSetPauseImage(java.lang.String);
    method public abstract void onSetPreviewSurface(android.view.Surface);
    method public abstract void onSetZoom(float);
    method public void receiveSessionModifyRequest(android.telecomm.VideoCallProfile);
    method public void receiveSessionModifyResponse(int, android.telecomm.VideoCallProfile, android.telecomm.VideoCallProfile);
  }
}
package android.telephony {
@@ -39777,8 +39777,8 @@ package android.widget {
    method public void setLogo(android.graphics.drawable.Drawable);
    method public void setLogoDescription(int);
    method public void setLogoDescription(java.lang.CharSequence);
    method public void setNavigationContentDescription(java.lang.CharSequence);
    method public void setNavigationContentDescription(int);
    method public void setNavigationContentDescription(java.lang.CharSequence);
    method public void setNavigationIcon(int);
    method public void setNavigationIcon(android.graphics.drawable.Drawable);
    method public void setNavigationOnClickListener(android.view.View.OnClickListener);
+5 −4
Original line number Diff line number Diff line
@@ -44,7 +44,8 @@ public abstract class Connection {
        public void onDestroyed(Connection c) {}
        public void onCallCapabilitiesChanged(Connection c, int callCapabilities) {}
        public void onParentConnectionChanged(Connection c, Connection parent) {}
        public void onVideoCallProviderChanged(Connection c, VideoCallProvider videoCallProvider) {}
        public void onVideoCallProviderChanged(
                Connection c, ConnectionService.VideoCallProvider videoCallProvider) {}
        public void onAudioModeIsVoipChanged(Connection c, boolean isVoip) {}
        public void onStatusHintsChanged(Connection c, StatusHints statusHints) {}
        public void onStartActivityFromInCall(Connection c, PendingIntent intent) {}
@@ -78,7 +79,7 @@ public abstract class Connection {
    private boolean mRequestingRingback = false;
    private int mCallCapabilities;
    private Connection mParentConnection;
    private VideoCallProvider mVideoCallProvider;
    private ConnectionService.VideoCallProvider mVideoCallProvider;
    private boolean mAudioModeIsVoip;
    private StatusHints mStatusHints;
    private int mVideoState;
@@ -417,14 +418,14 @@ public abstract class Connection {
     * Sets the video call provider.
     * @param videoCallProvider The video call provider.
     */
    public final void setVideoCallProvider(VideoCallProvider videoCallProvider) {
    public final void setVideoCallProvider(ConnectionService.VideoCallProvider videoCallProvider) {
        mVideoCallProvider = videoCallProvider;
        for (Listener l : mListeners) {
            l.onVideoCallProviderChanged(this, videoCallProvider);
        }
    }

    public final VideoCallProvider getVideoCallProvider() {
    public final ConnectionService.VideoCallProvider getVideoCallProvider() {
        return mVideoCallProvider;
    }

+313 −0
Original line number Diff line number Diff line
@@ -29,9 +29,14 @@ import android.os.IBinder;
import android.os.Looper;
import android.os.Message;
import android.telephony.DisconnectCause;
import android.os.RemoteException;
import android.view.Surface;

import com.android.internal.os.SomeArgs;
import com.android.internal.telecomm.IConnectionService;
import com.android.internal.telecomm.IConnectionServiceAdapter;
import com.android.internal.telecomm.IVideoCallCallback;
import com.android.internal.telecomm.IVideoCallProvider;
import com.android.internal.telecomm.RemoteServiceCallback;

import java.util.Collection;
@@ -758,4 +763,312 @@ public abstract class ConnectionService extends Service {
        Log.w(this, "%s - Cannot find Connection %s", action, callId);
        return NULL_CONNECTION;
    }

    public static abstract class VideoCallProvider {
        private static final int MSG_SET_VIDEO_CALL_LISTENER = 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;
        private static final int MSG_SET_DEVICE_ORIENTATION = 5;
        private static final int MSG_SET_ZOOM = 6;
        private static final int MSG_SEND_SESSION_MODIFY_REQUEST = 7;
        private static final int MSG_SEND_SESSION_MODIFY_RESPONSE = 8;
        private static final int MSG_REQUEST_CAMERA_CAPABILITIES = 9;
        private static final int MSG_REQUEST_CALL_DATA_USAGE = 10;
        private static final int MSG_SET_PAUSE_IMAGE = 11;

        private final VideoCallProviderHandler mMessageHandler = new VideoCallProviderHandler();
        private final VideoCallProviderBinder mBinder;
        private IVideoCallCallback mVideoCallListener;

        /**
         * Default handler used to consolidate binder method calls onto a single thread.
         */
        private final class VideoCallProviderHandler extends Handler {
            @Override
            public void handleMessage(Message msg) {
                switch (msg.what) {
                    case MSG_SET_VIDEO_CALL_LISTENER:
                        mVideoCallListener = IVideoCallCallback.Stub.asInterface((IBinder) msg.obj);
                        break;
                    case MSG_SET_CAMERA:
                        onSetCamera((String) msg.obj);
                        break;
                    case MSG_SET_PREVIEW_SURFACE:
                        onSetPreviewSurface((Surface) msg.obj);
                        break;
                    case MSG_SET_DISPLAY_SURFACE:
                        onSetDisplaySurface((Surface) msg.obj);
                        break;
                    case MSG_SET_DEVICE_ORIENTATION:
                        onSetDeviceOrientation(msg.arg1);
                        break;
                    case MSG_SET_ZOOM:
                        onSetZoom((Float) msg.obj);
                        break;
                    case MSG_SEND_SESSION_MODIFY_REQUEST:
                        onSendSessionModifyRequest((VideoCallProfile) msg.obj);
                        break;
                    case MSG_SEND_SESSION_MODIFY_RESPONSE:
                        onSendSessionModifyResponse((VideoCallProfile) msg.obj);
                        break;
                    case MSG_REQUEST_CAMERA_CAPABILITIES:
                        onRequestCameraCapabilities();
                        break;
                    case MSG_REQUEST_CALL_DATA_USAGE:
                        onRequestCallDataUsage();
                        break;
                    case MSG_SET_PAUSE_IMAGE:
                        onSetPauseImage((String) msg.obj);
                        break;
                    default:
                        break;
                }
            }
        }

        /**
         * IVideoCallProvider stub implementation.
         */
        private final class VideoCallProviderBinder extends IVideoCallProvider.Stub {
            public void setVideoCallListener(IBinder videoCallListenerBinder) {
                mMessageHandler.obtainMessage(
                        MSG_SET_VIDEO_CALL_LISTENER, videoCallListenerBinder).sendToTarget();
            }

            public void setCamera(String cameraId) {
                mMessageHandler.obtainMessage(MSG_SET_CAMERA, cameraId).sendToTarget();
            }

            public void setPreviewSurface(Surface surface) {
                mMessageHandler.obtainMessage(MSG_SET_PREVIEW_SURFACE, surface).sendToTarget();
            }

            public void setDisplaySurface(Surface surface) {
                mMessageHandler.obtainMessage(MSG_SET_DISPLAY_SURFACE, surface).sendToTarget();
            }

            public void setDeviceOrientation(int rotation) {
                mMessageHandler.obtainMessage(MSG_SET_DEVICE_ORIENTATION, rotation).sendToTarget();
            }

            public void setZoom(float value) {
                mMessageHandler.obtainMessage(MSG_SET_ZOOM, value).sendToTarget();
            }

            public void sendSessionModifyRequest(VideoCallProfile requestProfile) {
                mMessageHandler.obtainMessage(
                        MSG_SEND_SESSION_MODIFY_REQUEST, requestProfile).sendToTarget();
            }

            public void sendSessionModifyResponse(VideoCallProfile responseProfile) {
                mMessageHandler.obtainMessage(
                        MSG_SEND_SESSION_MODIFY_RESPONSE, responseProfile).sendToTarget();
            }

            public void requestCameraCapabilities() {
                mMessageHandler.obtainMessage(MSG_REQUEST_CAMERA_CAPABILITIES).sendToTarget();
            }

            public void requestCallDataUsage() {
                mMessageHandler.obtainMessage(MSG_REQUEST_CALL_DATA_USAGE).sendToTarget();
            }

            public void setPauseImage(String uri) {
                mMessageHandler.obtainMessage(MSG_SET_PAUSE_IMAGE, uri).sendToTarget();
            }
        }

        public VideoCallProvider() {
            mBinder = new VideoCallProviderBinder();
        }

        /**
         * Returns binder object which can be used across IPC methods.
         * @hide
         */
        public final IVideoCallProvider getInterface() {
            return mBinder;
        }

        /**
         * Sets the camera to be used for video recording in a video call.
         *
         * @param cameraId The id of the camera.
         */
        public abstract void onSetCamera(String cameraId);

        /**
         * Sets the surface to be used for displaying a preview of what the user's camera is
         * currently capturing.  When video transmission is enabled, this is the video signal which is
         * sent to the remote device.
         *
         * @param surface The surface.
         */
        public abstract void onSetPreviewSurface(Surface surface);

        /**
         * Sets the surface to be used for displaying the video received from the remote device.
         *
         * @param surface The surface.
         */
        public abstract void onSetDisplaySurface(Surface surface);

        /**
         * Sets the device orientation, in degrees.  Assumes that a standard portrait orientation of the
         * device is 0 degrees.
         *
         * @param rotation The device orientation, in degrees.
         */
        public abstract void onSetDeviceOrientation(int rotation);

        /**
         * Sets camera zoom ratio.
         *
         * @param value The camera zoom ratio.
         */
        public abstract void onSetZoom(float value);

        /**
         * Issues a request to modify the properties of the current session.  The request is sent to
         * the remote device where it it handled by
         * {@link InCallService.VideoCall.Listener#onSessionModifyRequestReceived}.
         * Some examples of session modification requests: upgrade call from audio to video, downgrade
         * call from video to audio, pause video.
         *
         * @param requestProfile The requested call video properties.
         */
        public abstract void onSendSessionModifyRequest(VideoCallProfile requestProfile);

        /**te
         * Provides a response to a request to change the current call session video
         * properties.
         * This is in response to a request the InCall UI has received via
         * {@link InCallService.VideoCall.Listener#onSessionModifyRequestReceived}.
         * The response is handled on the remove device by
         * {@link InCallService.VideoCall.Listener#onSessionModifyResponseReceived}.
         *
         * @param responseProfile The response call video properties.
         */
        public abstract void onSendSessionModifyResponse(VideoCallProfile responseProfile);

        /**
         * Issues a request to the video provider to retrieve the camera capabilities.
         * Camera capabilities are reported back to the caller via
         * {@link InCallService.VideoCall.Listener#onCameraCapabilitiesChanged(CallCameraCapabilities)}.
         */
        public abstract void onRequestCameraCapabilities();

        /**
         * Issues a request to the video telephony framework to retrieve the cumulative data usage for
         * the current call.  Data usage is reported back to the caller via
         * {@link InCallService.VideoCall.Listener#onCallDataUsageChanged}.
         */
        public abstract void onRequestCallDataUsage();

        /**
         * Provides the video telephony framework with the URI of an image to be displayed to remote
         * devices when the video signal is paused.
         *
         * @param uri URI of image to display.
         */
        public abstract void onSetPauseImage(String uri);

        /**
         * Invokes callback method defined in {@link InCallService.VideoCall.Listener}.
         *
         * @param videoCallProfile The requested video call profile.
         */
        public void receiveSessionModifyRequest(VideoCallProfile videoCallProfile) {
            if (mVideoCallListener != null) {
                try {
                    mVideoCallListener.receiveSessionModifyRequest(videoCallProfile);
                } catch (RemoteException ignored) {
                }
            }
        }

        /**
         * Invokes callback method defined in {@link InCallService.VideoCall.Listener}.
         *
         * @param status Status of the session modify request.  Valid values are
         *               {@link InCallService.VideoCall#SESSION_MODIFY_REQUEST_SUCCESS},
         *               {@link InCallService.VideoCall#SESSION_MODIFY_REQUEST_FAIL},
         *               {@link InCallService.VideoCall#SESSION_MODIFY_REQUEST_INVALID}
         * @param requestedProfile The original request which was sent to the remote device.
         * @param responseProfile The actual profile changes made by the remote device.
         */
        public void receiveSessionModifyResponse(int status,
                                                 VideoCallProfile requestedProfile, VideoCallProfile responseProfile) {
            if (mVideoCallListener != null) {
                try {
                    mVideoCallListener.receiveSessionModifyResponse(
                            status, requestedProfile, responseProfile);
                } catch (RemoteException ignored) {
                }
            }
        }

        /**
         * Invokes callback method defined in {@link InCallService.VideoCall.Listener}.
         *
         * Valid values are: {@link InCallService.VideoCall#SESSION_EVENT_RX_PAUSE},
         * {@link InCallService.VideoCall#SESSION_EVENT_RX_RESUME},
         * {@link InCallService.VideoCall#SESSION_EVENT_TX_START},
         * {@link InCallService.VideoCall#SESSION_EVENT_TX_STOP}
         *
         * @param event The event.
         */
        public void handleCallSessionEvent(int event) {
            if (mVideoCallListener != null) {
                try {
                    mVideoCallListener.handleCallSessionEvent(event);
                } catch (RemoteException ignored) {
                }
            }
        }

        /**
         * Invokes callback method defined in {@link InCallService.VideoCall.Listener}.
         *
         * @param width  The updated peer video width.
         * @param height The updated peer video height.
         */
        public void changePeerDimensions(int width, int height) {
            if (mVideoCallListener != null) {
                try {
                    mVideoCallListener.changePeerDimensions(width, height);
                } catch (RemoteException ignored) {
                }
            }
        }

        /**
         * Invokes callback method defined in {@link InCallService.VideoCall.Listener}.
         *
         * @param dataUsage The updated data usage.
         */
        public void changeCallDataUsage(int dataUsage) {
            if (mVideoCallListener != null) {
                try {
                    mVideoCallListener.changeCallDataUsage(dataUsage);
                } catch (RemoteException ignored) {
                }
            }
        }

        /**
         * Invokes callback method defined in {@link InCallService.VideoCall.Listener}.
         *
         * @param callCameraCapabilities The changed camera capabilities.
         */
        public void changeCameraCapabilities(CallCameraCapabilities callCameraCapabilities) {
            if (mVideoCallListener != null) {
                try {
                    mVideoCallListener.changeCameraCapabilities(callCameraCapabilities);
                } catch (RemoteException ignored) {
                }
            }
        }
    }
}
+2 −1
Original line number Diff line number Diff line
@@ -275,7 +275,8 @@ final class ConnectionServiceAdapter implements DeathRecipient {
     * @param callId The unique ID of the call to set with the given call video provider.
     * @param videoCallProvider The call video provider instance to set on the call.
     */
    void setVideoCallProvider(String callId, VideoCallProvider videoCallProvider) {
    void setVideoCallProvider(
            String callId, ConnectionService.VideoCallProvider videoCallProvider) {
        for (IConnectionServiceAdapter adapter : mAdapters) {
            try {
                adapter.setVideoCallProvider(
+8 −7
Original line number Diff line number Diff line
@@ -339,12 +339,13 @@ public abstract class InCallService extends Service {
        public static abstract class Listener {
            /**
             * Called when a session modification request is received from the remote device.
             * The remote request is sent via {@link VideoCallProvider#onSendSessionModifyRequest}.
             * The InCall UI is responsible for potentially prompting the user whether they wish to
             * accept the new call profile (e.g. prompt user if they wish to accept an upgrade from
             * an audio to a video call) and should call
             * {@link VideoCallProvider#onSendSessionModifyResponse} to indicate the video settings
             * the user has agreed to.
             * The remote request is sent via
             * {@link ConnectionService.VideoCallProvider#onSendSessionModifyRequest}. The InCall UI
             * is responsible for potentially prompting the user whether they wish to accept the new
             * call profile (e.g. prompt user if they wish to accept an upgrade from an audio to a
             * video call) and should call
             * {@link ConnectionService.VideoCallProvider#onSendSessionModifyResponse} to indicate
             * the video settings the user has agreed to.
             *
             * @param videoCallProfile The requested video call profile.
             */
@@ -353,7 +354,7 @@ public abstract class InCallService extends Service {
            /**
             * Called when a response to a session modification request is received from the remote
             * device. The remote InCall UI sends the response using
             * {@link VideoCallProvider#onSendSessionModifyResponse}.
             * {@link ConnectionService.VideoCallProvider#onSendSessionModifyResponse}.
             *
             * @param status Status of the session modify request.  Valid values are
             *               {@link VideoCall#SESSION_MODIFY_REQUEST_SUCCESS},
Loading