|  | #include "VirtualTouchpadClient.h" | 
|  |  | 
|  | #include <android/dvr/IVirtualTouchpadService.h> | 
|  | #include <binder/IServiceManager.h> | 
|  |  | 
|  | namespace android { | 
|  | namespace dvr { | 
|  |  | 
|  | namespace { | 
|  |  | 
|  | class VirtualTouchpadClientImpl : public VirtualTouchpadClient { | 
|  | public: | 
|  | VirtualTouchpadClientImpl() {} | 
|  | ~VirtualTouchpadClientImpl() override { | 
|  | if (service_ != nullptr) { | 
|  | Detach(); | 
|  | } | 
|  | } | 
|  |  | 
|  | status_t Attach() { | 
|  | if (service_ != nullptr) { | 
|  | return ALREADY_EXISTS; | 
|  | } | 
|  | sp<IServiceManager> sm = defaultServiceManager(); | 
|  | if (sm == nullptr) { | 
|  | ALOGE("no service manager"); | 
|  | return NO_INIT; | 
|  | } | 
|  | sp<IVirtualTouchpadService> service = | 
|  | interface_cast<IVirtualTouchpadService>( | 
|  | sm->getService(IVirtualTouchpadService::SERVICE_NAME())); | 
|  | if (service == nullptr) { | 
|  | ALOGE("failed to get service"); | 
|  | return NAME_NOT_FOUND; | 
|  | } | 
|  | service_ = service; | 
|  | return service_->attach().transactionError(); | 
|  | } | 
|  |  | 
|  | status_t Detach() { | 
|  | if (service_ == nullptr) { | 
|  | return NO_INIT; | 
|  | } | 
|  | status_t status = service_->detach().transactionError(); | 
|  | service_ = nullptr; | 
|  | return status; | 
|  | } | 
|  |  | 
|  | status_t Touch(int touchpad, float x, float y, float pressure) override { | 
|  | if (service_ == nullptr) { | 
|  | return NO_INIT; | 
|  | } | 
|  | return service_->touch(touchpad, x, y, pressure).transactionError(); | 
|  | } | 
|  |  | 
|  | status_t ButtonState(int touchpad, int buttons) override { | 
|  | if (service_ == nullptr) { | 
|  | return NO_INIT; | 
|  | } | 
|  | return service_->buttonState(touchpad, buttons).transactionError(); | 
|  | } | 
|  |  | 
|  | status_t Scroll(int touchpad, float x, float y) override { | 
|  | if (service_ == nullptr) { | 
|  | return NO_INIT; | 
|  | } | 
|  | return service_->scroll(touchpad, x, y).transactionError(); | 
|  | } | 
|  |  | 
|  | void dumpInternal(String8& result) override { | 
|  | result.append("[virtual touchpad]\n"); | 
|  | result.appendFormat("connected = %s\n\n", | 
|  | service_ != nullptr ? "true" : "false"); | 
|  | } | 
|  |  | 
|  | private: | 
|  | sp<IVirtualTouchpadService> service_; | 
|  | }; | 
|  |  | 
|  | }  // anonymous namespace | 
|  |  | 
|  | std::unique_ptr<VirtualTouchpad> VirtualTouchpadClient::Create() { | 
|  | return std::unique_ptr<VirtualTouchpad>(new VirtualTouchpadClientImpl()); | 
|  | } | 
|  |  | 
|  | }  // namespace dvr | 
|  | }  // namespace android |