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();
+ }
}