1e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko#ifndef ANDROID_DVR_VIRTUAL_TOUCHPAD_SERVICE_H
2e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko#define ANDROID_DVR_VIRTUAL_TOUCHPAD_SERVICE_H
3e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
4e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko#include <android/dvr/BnVirtualTouchpadService.h>
5e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
6e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko#include "VirtualTouchpad.h"
7e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
8e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkonamespace android {
9e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkonamespace dvr {
10e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
1143b5b06c8be24e465bd6a7b22a8d341db1ad50a2Kevin Schoedel// VirtualTouchpadService implements the service side of
1243b5b06c8be24e465bd6a7b22a8d341db1ad50a2Kevin Schoedel// the Binder interface defined in VirtualTouchpadService.aidl.
1343b5b06c8be24e465bd6a7b22a8d341db1ad50a2Kevin Schoedel//
14e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkoclass VirtualTouchpadService : public BnVirtualTouchpadService {
15e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko public:
16de1cdaebc9b8fdbc5348e6c07f849b74bacc485dKevin Schoedel  VirtualTouchpadService(std::unique_ptr<VirtualTouchpad> touchpad)
17de1cdaebc9b8fdbc5348e6c07f849b74bacc485dKevin Schoedel      : touchpad_(std::move(touchpad)), client_pid_(0) {}
184b64dd48b6896d6b963f0a3a0259d3d2a7076a9eKevin Schoedel  ~VirtualTouchpadService() override;
19e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
20e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko protected:
21e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Implements IVirtualTouchpadService.
224b64dd48b6896d6b963f0a3a0259d3d2a7076a9eKevin Schoedel  binder::Status attach() override;
234b64dd48b6896d6b963f0a3a0259d3d2a7076a9eKevin Schoedel  binder::Status detach() override;
243002b8a74431dd7c005269cf9306443a4b4963f1Kevin Schoedel  binder::Status touch(int touchpad, float x, float y, float pressure) override;
253002b8a74431dd7c005269cf9306443a4b4963f1Kevin Schoedel  binder::Status buttonState(int touchpad, int buttons) override;
26d8fccf0124b78230ae2071fecc6bc6aebe8c540cKevin Schoedel  binder::Status scroll(int touchpad, float x, float y) override;
27e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
284b64dd48b6896d6b963f0a3a0259d3d2a7076a9eKevin Schoedel  // Implements BBinder::dump().
294b64dd48b6896d6b963f0a3a0259d3d2a7076a9eKevin Schoedel  status_t dump(int fd, const Vector<String16>& args) override;
304b64dd48b6896d6b963f0a3a0259d3d2a7076a9eKevin Schoedel
31e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko private:
324b64dd48b6896d6b963f0a3a0259d3d2a7076a9eKevin Schoedel  bool CheckPermissions();
334b64dd48b6896d6b963f0a3a0259d3d2a7076a9eKevin Schoedel  bool CheckTouchPermission(pid_t* out_pid);
344b64dd48b6896d6b963f0a3a0259d3d2a7076a9eKevin Schoedel
35de1cdaebc9b8fdbc5348e6c07f849b74bacc485dKevin Schoedel  std::unique_ptr<VirtualTouchpad> touchpad_;
36e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
374b64dd48b6896d6b963f0a3a0259d3d2a7076a9eKevin Schoedel  // Only one client at a time can use the virtual touchpad.
384b64dd48b6896d6b963f0a3a0259d3d2a7076a9eKevin Schoedel  pid_t client_pid_;
394b64dd48b6896d6b963f0a3a0259d3d2a7076a9eKevin Schoedel
40e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  VirtualTouchpadService(const VirtualTouchpadService&) = delete;
41e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  void operator=(const VirtualTouchpadService&) = delete;
42e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko};
43e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
44e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko}  // namespace dvr
45e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko}  // namespace android
46e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
47e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko#endif  // ANDROID_DVR_VIRTUAL_TOUCHPAD_SERVICE_H
48