Provide a library interface to the virtual touchpad service.
And make VrWindowManager pay for^H^H^H^H^H^H^H^H use it. The library
interface is a step toward moving 2D embedding into VrCore because it
hides the binder connection that isn't directly accessible to VrCore.
As a matter of implementation, the touchpad-service client library
and the low-level evdev touchpad are derived from the same interface.
Bug: b/35990873
Test: VirtualTouchpad_test; integration TBD.
Change-Id: Ic922ff223ddd5a44f6fb4433a271f8341e93a0e7
diff --git a/services/vr/virtual_touchpad/VirtualTouchpadClient.cpp b/services/vr/virtual_touchpad/VirtualTouchpadClient.cpp
new file mode 100644
index 0000000..23a2e31
--- /dev/null
+++ b/services/vr/virtual_touchpad/VirtualTouchpadClient.cpp
@@ -0,0 +1,52 @@
+#include "VirtualTouchpadClient.h"
+
+#include <android/dvr/IVirtualTouchpadService.h>
+#include <binder/IServiceManager.h>
+
+namespace android {
+namespace dvr {
+
+namespace {
+
+class VirtualTouchpadClientImpl : public VirtualTouchpadClient {
+ public:
+ VirtualTouchpadClientImpl(sp<IVirtualTouchpadService> service)
+ : service_(service) {}
+ ~VirtualTouchpadClientImpl() {}
+
+ status_t Touch(float x, float y, float pressure) override {
+ if (service_ == nullptr) {
+ return NO_INIT;
+ }
+ return service_->touch(x, y, pressure).transactionError();
+ }
+ status_t ButtonState(int buttons) override {
+ if (service_ == nullptr) {
+ return NO_INIT;
+ }
+ return service_->buttonState(buttons).transactionError();
+ }
+
+ private:
+ sp<IVirtualTouchpadService> service_;
+};
+
+} // anonymous namespace
+
+sp<VirtualTouchpad> VirtualTouchpadClient::Create() {
+ sp<IServiceManager> sm = defaultServiceManager();
+ if (sm == nullptr) {
+ ALOGE("no service manager");
+ return sp<VirtualTouchpad>();
+ }
+ sp<IVirtualTouchpadService> service = interface_cast<IVirtualTouchpadService>(
+ sm->getService(IVirtualTouchpadService::SERVICE_NAME()));
+ if (service == nullptr) {
+ ALOGE("failed to get service");
+ return sp<VirtualTouchpad>();
+ }
+ return new VirtualTouchpadClientImpl(service);
+}
+
+} // namespace dvr
+} // namespace android