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