189af70bce420f011adfeb0f80984b3895c4d7d9bKevin Schoedel#include "VirtualTouchpadClient.h"
289af70bce420f011adfeb0f80984b3895c4d7d9bKevin Schoedel
389af70bce420f011adfeb0f80984b3895c4d7d9bKevin Schoedel#include <android/dvr/IVirtualTouchpadService.h>
489af70bce420f011adfeb0f80984b3895c4d7d9bKevin Schoedel#include <binder/IServiceManager.h>
589af70bce420f011adfeb0f80984b3895c4d7d9bKevin Schoedel
689af70bce420f011adfeb0f80984b3895c4d7d9bKevin Schoedelnamespace android {
789af70bce420f011adfeb0f80984b3895c4d7d9bKevin Schoedelnamespace dvr {
889af70bce420f011adfeb0f80984b3895c4d7d9bKevin Schoedel
989af70bce420f011adfeb0f80984b3895c4d7d9bKevin Schoedelnamespace {
1089af70bce420f011adfeb0f80984b3895c4d7d9bKevin Schoedel
1189af70bce420f011adfeb0f80984b3895c4d7d9bKevin Schoedelclass VirtualTouchpadClientImpl : public VirtualTouchpadClient {
1289af70bce420f011adfeb0f80984b3895c4d7d9bKevin Schoedel public:
134b64dd48b6896d6b963f0a3a0259d3d2a7076a9eKevin Schoedel  VirtualTouchpadClientImpl() {}
144b64dd48b6896d6b963f0a3a0259d3d2a7076a9eKevin Schoedel  ~VirtualTouchpadClientImpl() override {
154b64dd48b6896d6b963f0a3a0259d3d2a7076a9eKevin Schoedel    if (service_ != nullptr) {
164b64dd48b6896d6b963f0a3a0259d3d2a7076a9eKevin Schoedel      Detach();
174b64dd48b6896d6b963f0a3a0259d3d2a7076a9eKevin Schoedel    }
184b64dd48b6896d6b963f0a3a0259d3d2a7076a9eKevin Schoedel  }
194b64dd48b6896d6b963f0a3a0259d3d2a7076a9eKevin Schoedel
204b64dd48b6896d6b963f0a3a0259d3d2a7076a9eKevin Schoedel  status_t Attach() {
214b64dd48b6896d6b963f0a3a0259d3d2a7076a9eKevin Schoedel    if (service_ != nullptr) {
224b64dd48b6896d6b963f0a3a0259d3d2a7076a9eKevin Schoedel      return ALREADY_EXISTS;
234b64dd48b6896d6b963f0a3a0259d3d2a7076a9eKevin Schoedel    }
244b64dd48b6896d6b963f0a3a0259d3d2a7076a9eKevin Schoedel    sp<IServiceManager> sm = defaultServiceManager();
254b64dd48b6896d6b963f0a3a0259d3d2a7076a9eKevin Schoedel    if (sm == nullptr) {
264b64dd48b6896d6b963f0a3a0259d3d2a7076a9eKevin Schoedel      ALOGE("no service manager");
274b64dd48b6896d6b963f0a3a0259d3d2a7076a9eKevin Schoedel      return NO_INIT;
284b64dd48b6896d6b963f0a3a0259d3d2a7076a9eKevin Schoedel    }
294b64dd48b6896d6b963f0a3a0259d3d2a7076a9eKevin Schoedel    sp<IVirtualTouchpadService> service =
304b64dd48b6896d6b963f0a3a0259d3d2a7076a9eKevin Schoedel        interface_cast<IVirtualTouchpadService>(
314b64dd48b6896d6b963f0a3a0259d3d2a7076a9eKevin Schoedel            sm->getService(IVirtualTouchpadService::SERVICE_NAME()));
324b64dd48b6896d6b963f0a3a0259d3d2a7076a9eKevin Schoedel    if (service == nullptr) {
334b64dd48b6896d6b963f0a3a0259d3d2a7076a9eKevin Schoedel      ALOGE("failed to get service");
344b64dd48b6896d6b963f0a3a0259d3d2a7076a9eKevin Schoedel      return NAME_NOT_FOUND;
354b64dd48b6896d6b963f0a3a0259d3d2a7076a9eKevin Schoedel    }
364b64dd48b6896d6b963f0a3a0259d3d2a7076a9eKevin Schoedel    service_ = service;
374b64dd48b6896d6b963f0a3a0259d3d2a7076a9eKevin Schoedel    return service_->attach().transactionError();
384b64dd48b6896d6b963f0a3a0259d3d2a7076a9eKevin Schoedel  }
394b64dd48b6896d6b963f0a3a0259d3d2a7076a9eKevin Schoedel
404b64dd48b6896d6b963f0a3a0259d3d2a7076a9eKevin Schoedel  status_t Detach() {
414b64dd48b6896d6b963f0a3a0259d3d2a7076a9eKevin Schoedel    if (service_ == nullptr) {
424b64dd48b6896d6b963f0a3a0259d3d2a7076a9eKevin Schoedel      return NO_INIT;
434b64dd48b6896d6b963f0a3a0259d3d2a7076a9eKevin Schoedel    }
444b64dd48b6896d6b963f0a3a0259d3d2a7076a9eKevin Schoedel    status_t status = service_->detach().transactionError();
454b64dd48b6896d6b963f0a3a0259d3d2a7076a9eKevin Schoedel    service_ = nullptr;
464b64dd48b6896d6b963f0a3a0259d3d2a7076a9eKevin Schoedel    return status;
474b64dd48b6896d6b963f0a3a0259d3d2a7076a9eKevin Schoedel  }
4889af70bce420f011adfeb0f80984b3895c4d7d9bKevin Schoedel
494b64dd48b6896d6b963f0a3a0259d3d2a7076a9eKevin Schoedel  status_t Touch(int touchpad, float x, float y, float pressure) override {
5089af70bce420f011adfeb0f80984b3895c4d7d9bKevin Schoedel    if (service_ == nullptr) {
5189af70bce420f011adfeb0f80984b3895c4d7d9bKevin Schoedel      return NO_INIT;
5289af70bce420f011adfeb0f80984b3895c4d7d9bKevin Schoedel    }
533002b8a74431dd7c005269cf9306443a4b4963f1Kevin Schoedel    return service_->touch(touchpad, x, y, pressure).transactionError();
5489af70bce420f011adfeb0f80984b3895c4d7d9bKevin Schoedel  }
554b64dd48b6896d6b963f0a3a0259d3d2a7076a9eKevin Schoedel
563002b8a74431dd7c005269cf9306443a4b4963f1Kevin Schoedel  status_t ButtonState(int touchpad, int buttons) override {
5789af70bce420f011adfeb0f80984b3895c4d7d9bKevin Schoedel    if (service_ == nullptr) {
5889af70bce420f011adfeb0f80984b3895c4d7d9bKevin Schoedel      return NO_INIT;
5989af70bce420f011adfeb0f80984b3895c4d7d9bKevin Schoedel    }
603002b8a74431dd7c005269cf9306443a4b4963f1Kevin Schoedel    return service_->buttonState(touchpad, buttons).transactionError();
6189af70bce420f011adfeb0f80984b3895c4d7d9bKevin Schoedel  }
6289af70bce420f011adfeb0f80984b3895c4d7d9bKevin Schoedel
634b64dd48b6896d6b963f0a3a0259d3d2a7076a9eKevin Schoedel  void dumpInternal(String8& result) override {
644b64dd48b6896d6b963f0a3a0259d3d2a7076a9eKevin Schoedel    result.append("[virtual touchpad]\n");
654b64dd48b6896d6b963f0a3a0259d3d2a7076a9eKevin Schoedel    result.appendFormat("connected = %s\n\n",
664b64dd48b6896d6b963f0a3a0259d3d2a7076a9eKevin Schoedel                        service_ != nullptr ? "true" : "false");
674b64dd48b6896d6b963f0a3a0259d3d2a7076a9eKevin Schoedel  }
684b64dd48b6896d6b963f0a3a0259d3d2a7076a9eKevin Schoedel
6989af70bce420f011adfeb0f80984b3895c4d7d9bKevin Schoedel private:
7089af70bce420f011adfeb0f80984b3895c4d7d9bKevin Schoedel  sp<IVirtualTouchpadService> service_;
7189af70bce420f011adfeb0f80984b3895c4d7d9bKevin Schoedel};
7289af70bce420f011adfeb0f80984b3895c4d7d9bKevin Schoedel
7389af70bce420f011adfeb0f80984b3895c4d7d9bKevin Schoedel}  // anonymous namespace
7489af70bce420f011adfeb0f80984b3895c4d7d9bKevin Schoedel
75de1cdaebc9b8fdbc5348e6c07f849b74bacc485dKevin Schoedelstd::unique_ptr<VirtualTouchpad> VirtualTouchpadClient::Create() {
76de1cdaebc9b8fdbc5348e6c07f849b74bacc485dKevin Schoedel  return std::unique_ptr<VirtualTouchpad>(new VirtualTouchpadClientImpl());
7789af70bce420f011adfeb0f80984b3895c4d7d9bKevin Schoedel}
7889af70bce420f011adfeb0f80984b3895c4d7d9bKevin Schoedel
7989af70bce420f011adfeb0f80984b3895c4d7d9bKevin Schoedel}  // namespace dvr
8089af70bce420f011adfeb0f80984b3895c4d7d9bKevin Schoedel}  // namespace android
81