Modify ImsVideoCallProvider to include calling UID for permission check.
Tyler Gunn [Wed, 30 Nov 2016 23:16:52 +0000 (15:16 -0800)]
Modify the ImsVideoCallProvider, which the vendor IMS stack implements to
include the UID of telephony.  The vendor IMS stack will use this when
opening the camera for the purpose of camera permission verification by
the camera service.

Test: Unit, manual.
Bug: 32747443
Change-Id: I0884cc08ea4afa23c08e3fe1e2873b3f5aac2b40

src/java/com/android/ims/internal/ImsVideoCallProvider.java
src/java/com/android/ims/internal/ImsVideoCallProviderWrapper.java

index 7050631..25aa694 100644 (file)
@@ -56,8 +56,16 @@ public abstract class ImsVideoCallProvider {
                     mCallback = (IImsVideoCallCallback) msg.obj;
                     break;
                 case MSG_SET_CAMERA:
-                    onSetCamera((String) msg.obj);
+                {
+                    SomeArgs args = (SomeArgs) msg.obj;
+                    try {
+                        onSetCamera((String) args.arg1);
+                        onSetCamera((String) args.arg1, args.argi1);
+                    } finally {
+                        args.recycle();
+                    }
                     break;
+                }
                 case MSG_SET_PREVIEW_SURFACE:
                     onSetPreviewSurface((Surface) msg.obj);
                     break;
@@ -108,8 +116,11 @@ public abstract class ImsVideoCallProvider {
             mProviderHandler.obtainMessage(MSG_SET_CALLBACK, callback).sendToTarget();
         }
 
-        public void setCamera(String cameraId) {
-            mProviderHandler.obtainMessage(MSG_SET_CAMERA, cameraId).sendToTarget();
+        public void setCamera(String cameraId, int uid) {
+            SomeArgs args = SomeArgs.obtain();
+            args.arg1 = cameraId;
+            args.argi1 = uid;
+            mProviderHandler.obtainMessage(MSG_SET_CAMERA, args).sendToTarget();
         }
 
         public void setPreviewSurface(Surface surface) {
@@ -167,6 +178,18 @@ public abstract class ImsVideoCallProvider {
     /** @see Connection.VideoProvider#onSetCamera */
     public abstract void onSetCamera(String cameraId);
 
+    /**
+     * Similar to {@link #onSetCamera(String)}, except includes the UID of the calling process which
+     * the IMS service uses when opening the camera.  This ensures camera permissions are verified
+     * by the camera service.
+     *
+     * @param cameraId The id of the camera to be opened.
+     * @param uid The uid of the caller, used when opening the camera for permission verification.
+     * @see Connection.VideoProvider#onSetCamera
+     */
+    public void onSetCamera(String cameraId, int uid) {
+    }
+
     /** @see Connection.VideoProvider#onSetPreviewSurface */
     public abstract void onSetPreviewSurface(Surface surface);
 
index 3f0e629..0b239ac 100644 (file)
@@ -17,6 +17,7 @@
 package com.android.ims.internal;
 
 import android.net.Uri;
+import android.os.Binder;
 import android.os.Handler;
 import android.os.IBinder;
 import android.os.Looper;
@@ -216,7 +217,7 @@ public class ImsVideoCallProviderWrapper extends Connection.VideoProvider {
     /** @inheritDoc */
     public void onSetCamera(String cameraId) {
         try {
-            mVideoCallProvider.setCamera(cameraId);
+            mVideoCallProvider.setCamera(cameraId, Binder.getCallingUid());
         } catch (RemoteException e) {
         }
     }