Manage controller connection from VrCore to VrWindowManager.

Use VrManager as a proxy to pass the controller data file descriptor
from VrCore to VrWindowManager, since the latter is a purely native
service with no Java visibility.

This is intended to be replaced by moving the relevant parts of
VrWindowManager into VrCore (b/36506799).

Bug: 35619424
Test: manual on device
Change-Id: I9545349893ed9b23de4ba8d3cb61c7d403ad0b97
diff --git a/core/java/android/app/VrManager.java b/core/java/android/app/VrManager.java
index a0b0eea..4dd578e 100644
--- a/core/java/android/app/VrManager.java
+++ b/core/java/android/app/VrManager.java
@@ -6,6 +6,8 @@
 import android.os.RemoteException;
 import android.service.vr.IVrManager;
 
+import java.io.FileDescriptor;
+
 /**
  * Used to control aspects of a devices Virtual Reality (VR) capabilities.
  * <p>
@@ -41,4 +43,32 @@
             e.rethrowFromSystemServer();
         }
     }
+
+    /**
+     * Initiate connection for system controller data.
+     *
+     * @param fd Controller data file descriptor.
+     *
+     * {@hide}
+     */
+    public void connectController(FileDescriptor fd) {
+        try {
+            mService.connectController(fd);
+        } catch (RemoteException e) {
+            e.rethrowFromSystemServer();
+        }
+    }
+
+    /**
+     * Sever connection for system controller data.
+     *
+     * {@hide}
+     */
+    public void disconnectController() {
+        try {
+            mService.disconnectController();
+        } catch (RemoteException e) {
+            e.rethrowFromSystemServer();
+        }
+    }
 }
diff --git a/core/java/android/service/vr/IVrManager.aidl b/core/java/android/service/vr/IVrManager.aidl
index fce06d6..6eea07d 100644
--- a/core/java/android/service/vr/IVrManager.aidl
+++ b/core/java/android/service/vr/IVrManager.aidl
@@ -73,5 +73,17 @@
      * currently, else return the display id of the virtual display
      */
     int getCompatibilityDisplayId();
+
+    /**
+     * Initiate connection for system controller data.
+     *
+     * @param fd Controller data file descriptor.
+     */
+    void connectController(in FileDescriptor fd);
+
+    /**
+     * Sever connection for system controller data.
+     */
+    void disconnectController();
 }
 
diff --git a/services/core/Android.mk b/services/core/Android.mk
index d312902..e35a171 100644
--- a/services/core/Android.mk
+++ b/services/core/Android.mk
@@ -13,6 +13,7 @@
     ../../../../system/netd/server/binder/android/net/INetd.aidl \
     ../../../../system/netd/server/binder/android/net/metrics/INetdEventListener.aidl \
     ../../../native/cmds/installd/binder/android/os/IInstalld.aidl \
+    ../../../native/services/vr/vr_window_manager/aidl/android/service/vr/IVrWindowManager.aidl \
 
 LOCAL_AIDL_INCLUDES += \
     system/netd/server/binder
diff --git a/services/core/java/com/android/server/vr/VrManagerService.java b/services/core/java/com/android/server/vr/VrManagerService.java
index e1df0ba..731f53f 100644
--- a/services/core/java/com/android/server/vr/VrManagerService.java
+++ b/services/core/java/com/android/server/vr/VrManagerService.java
@@ -37,6 +37,7 @@
 import android.os.Message;
 import android.os.RemoteCallbackList;
 import android.os.RemoteException;
+import android.os.ServiceManager;
 import android.os.UserHandle;
 import android.provider.Settings;
 import android.service.notification.NotificationListenerService;
@@ -44,6 +45,7 @@
 import android.service.vr.IVrListener;
 import android.service.vr.IVrManager;
 import android.service.vr.IVrStateCallbacks;
+import android.service.vr.IVrWindowManager;
 import android.service.vr.VrListenerService;
 import android.text.TextUtils;
 import android.util.ArrayMap;
@@ -427,6 +429,18 @@
         }
 
         @Override
+        public void connectController(FileDescriptor fd) throws android.os.RemoteException {
+            enforceCallerPermission(Manifest.permission.RESTRICTED_VR_ACCESS);
+            VrManagerService.this.connectController(fd);
+        }
+
+        @Override
+        public void disconnectController() throws android.os.RemoteException {
+            enforceCallerPermission(Manifest.permission.RESTRICTED_VR_ACCESS);
+            VrManagerService.this.disconnectController();
+        }
+
+        @Override
         protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
             if (getContext().checkCallingOrSelfPermission(android.Manifest.permission.DUMP)
                     != PackageManager.PERMISSION_GRANTED) {
@@ -1151,4 +1165,20 @@
             return mVrModeEnabled;
         }
     }
+
+    private void connectController(FileDescriptor fd) throws android.os.RemoteException {
+        // TODO(b/36506799): move vr_wm code to VrCore and remove this.
+        IVrWindowManager remote =
+                IVrWindowManager.Stub.asInterface(
+                        ServiceManager.getService(IVrWindowManager.SERVICE_NAME));
+        remote.connectController(fd);
+    }
+
+    private void disconnectController() throws android.os.RemoteException {
+        // TODO(b/36506799): move vr_wm code to VrCore and remove this.
+        IVrWindowManager remote =
+                IVrWindowManager.Stub.asInterface(
+                        ServiceManager.getService(IVrWindowManager.SERVICE_NAME));
+        remote.disconnectController();
+    }
 }