189af70bce420f011adfeb0f80984b3895c4d7d9bKevin Schoedel#ifndef ANDROID_DVR_VIRTUAL_TOUCHPAD_INTERFACE_H
289af70bce420f011adfeb0f80984b3895c4d7d9bKevin Schoedel#define ANDROID_DVR_VIRTUAL_TOUCHPAD_INTERFACE_H
389af70bce420f011adfeb0f80984b3895c4d7d9bKevin Schoedel
4de1cdaebc9b8fdbc5348e6c07f849b74bacc485dKevin Schoedel#include "dvr/virtual_touchpad_client.h"
5de1cdaebc9b8fdbc5348e6c07f849b74bacc485dKevin Schoedel
6de1cdaebc9b8fdbc5348e6c07f849b74bacc485dKevin Schoedel#include <memory>
789af70bce420f011adfeb0f80984b3895c4d7d9bKevin Schoedel#include <utils/Errors.h>
84b64dd48b6896d6b963f0a3a0259d3d2a7076a9eKevin Schoedel#include <utils/String8.h>
989af70bce420f011adfeb0f80984b3895c4d7d9bKevin Schoedel
1089af70bce420f011adfeb0f80984b3895c4d7d9bKevin Schoedelnamespace android {
1189af70bce420f011adfeb0f80984b3895c4d7d9bKevin Schoedelnamespace dvr {
1289af70bce420f011adfeb0f80984b3895c4d7d9bKevin Schoedel
1389af70bce420f011adfeb0f80984b3895c4d7d9bKevin Schoedel// Provides a virtual touchpad for injecting events into the input system.
1489af70bce420f011adfeb0f80984b3895c4d7d9bKevin Schoedel//
15de1cdaebc9b8fdbc5348e6c07f849b74bacc485dKevin Schoedelclass VirtualTouchpad {
1689af70bce420f011adfeb0f80984b3895c4d7d9bKevin Schoedel public:
173002b8a74431dd7c005269cf9306443a4b4963f1Kevin Schoedel  enum : int {
18de1cdaebc9b8fdbc5348e6c07f849b74bacc485dKevin Schoedel    PRIMARY = DVR_VIRTUAL_TOUCHPAD_PRIMARY,
19de1cdaebc9b8fdbc5348e6c07f849b74bacc485dKevin Schoedel    VIRTUAL = DVR_VIRTUAL_TOUCHPAD_VIRTUAL,
203002b8a74431dd7c005269cf9306443a4b4963f1Kevin Schoedel  };
213002b8a74431dd7c005269cf9306443a4b4963f1Kevin Schoedel
22de1cdaebc9b8fdbc5348e6c07f849b74bacc485dKevin Schoedel  virtual ~VirtualTouchpad() {}
23de1cdaebc9b8fdbc5348e6c07f849b74bacc485dKevin Schoedel
2489af70bce420f011adfeb0f80984b3895c4d7d9bKevin Schoedel  // Create a virtual touchpad.
2589af70bce420f011adfeb0f80984b3895c4d7d9bKevin Schoedel  // Implementations should provide this, and hide their constructors.
2689af70bce420f011adfeb0f80984b3895c4d7d9bKevin Schoedel  // For the user, switching implementations should be as simple as changing
2789af70bce420f011adfeb0f80984b3895c4d7d9bKevin Schoedel  // the class whose |Create()| is called.
284b64dd48b6896d6b963f0a3a0259d3d2a7076a9eKevin Schoedel  // Implementations should be minimial; major resource allocation should
294b64dd48b6896d6b963f0a3a0259d3d2a7076a9eKevin Schoedel  // be performed in Attach().
30de1cdaebc9b8fdbc5348e6c07f849b74bacc485dKevin Schoedel  static std::unique_ptr<VirtualTouchpad> Create() {
31de1cdaebc9b8fdbc5348e6c07f849b74bacc485dKevin Schoedel    return nullptr;
3289af70bce420f011adfeb0f80984b3895c4d7d9bKevin Schoedel  }
3389af70bce420f011adfeb0f80984b3895c4d7d9bKevin Schoedel
344b64dd48b6896d6b963f0a3a0259d3d2a7076a9eKevin Schoedel  // Initialize a virtual touchpad.
354b64dd48b6896d6b963f0a3a0259d3d2a7076a9eKevin Schoedel  virtual status_t Attach() = 0;
364b64dd48b6896d6b963f0a3a0259d3d2a7076a9eKevin Schoedel
374b64dd48b6896d6b963f0a3a0259d3d2a7076a9eKevin Schoedel  // Shut down a virtual touchpad.
384b64dd48b6896d6b963f0a3a0259d3d2a7076a9eKevin Schoedel  virtual status_t Detach() = 0;
394b64dd48b6896d6b963f0a3a0259d3d2a7076a9eKevin Schoedel
4089af70bce420f011adfeb0f80984b3895c4d7d9bKevin Schoedel  // Generate a simulated touch event.
4189af70bce420f011adfeb0f80984b3895c4d7d9bKevin Schoedel  //
423002b8a74431dd7c005269cf9306443a4b4963f1Kevin Schoedel  // @param touchpad Touchpad selector index.
4389af70bce420f011adfeb0f80984b3895c4d7d9bKevin Schoedel  // @param x Horizontal touch position.
4489af70bce420f011adfeb0f80984b3895c4d7d9bKevin Schoedel  // @param y Vertical touch position.
4589af70bce420f011adfeb0f80984b3895c4d7d9bKevin Schoedel  //            Values must be in the range [0.0, 1.0).
4689af70bce420f011adfeb0f80984b3895c4d7d9bKevin Schoedel  // @param pressure Touch pressure.
4789af70bce420f011adfeb0f80984b3895c4d7d9bKevin Schoedel  //            Positive values represent contact; use 1.0f if contact
4889af70bce420f011adfeb0f80984b3895c4d7d9bKevin Schoedel  //            is binary. Use 0.0f for no contact.
4989af70bce420f011adfeb0f80984b3895c4d7d9bKevin Schoedel  // @returns OK on success.
5089af70bce420f011adfeb0f80984b3895c4d7d9bKevin Schoedel  //
513002b8a74431dd7c005269cf9306443a4b4963f1Kevin Schoedel  virtual status_t Touch(int touchpad, float x, float y, float pressure) = 0;
5289af70bce420f011adfeb0f80984b3895c4d7d9bKevin Schoedel
5389af70bce420f011adfeb0f80984b3895c4d7d9bKevin Schoedel  // Generate a simulated touchpad button state.
5489af70bce420f011adfeb0f80984b3895c4d7d9bKevin Schoedel  //
553002b8a74431dd7c005269cf9306443a4b4963f1Kevin Schoedel  // @param touchpad Touchpad selector index.
5689af70bce420f011adfeb0f80984b3895c4d7d9bKevin Schoedel  // @param buttons A union of MotionEvent BUTTON_* values.
5789af70bce420f011adfeb0f80984b3895c4d7d9bKevin Schoedel  // @returns OK on success.
5889af70bce420f011adfeb0f80984b3895c4d7d9bKevin Schoedel  //
5989af70bce420f011adfeb0f80984b3895c4d7d9bKevin Schoedel  // Currently only BUTTON_BACK is supported, as the implementation
6089af70bce420f011adfeb0f80984b3895c4d7d9bKevin Schoedel  // restricts itself to operations actually required by VrWindowManager.
6189af70bce420f011adfeb0f80984b3895c4d7d9bKevin Schoedel  //
623002b8a74431dd7c005269cf9306443a4b4963f1Kevin Schoedel  virtual status_t ButtonState(int touchpad, int buttons) = 0;
6389af70bce420f011adfeb0f80984b3895c4d7d9bKevin Schoedel
644b64dd48b6896d6b963f0a3a0259d3d2a7076a9eKevin Schoedel  // Report state for 'dumpsys'.
654b64dd48b6896d6b963f0a3a0259d3d2a7076a9eKevin Schoedel  virtual void dumpInternal(String8& result) = 0;
664b64dd48b6896d6b963f0a3a0259d3d2a7076a9eKevin Schoedel
6789af70bce420f011adfeb0f80984b3895c4d7d9bKevin Schoedel protected:
6889af70bce420f011adfeb0f80984b3895c4d7d9bKevin Schoedel  VirtualTouchpad() {}
6989af70bce420f011adfeb0f80984b3895c4d7d9bKevin Schoedel
7089af70bce420f011adfeb0f80984b3895c4d7d9bKevin Schoedel private:
7189af70bce420f011adfeb0f80984b3895c4d7d9bKevin Schoedel  VirtualTouchpad(const VirtualTouchpad&) = delete;
7289af70bce420f011adfeb0f80984b3895c4d7d9bKevin Schoedel  void operator=(const VirtualTouchpad&) = delete;
7389af70bce420f011adfeb0f80984b3895c4d7d9bKevin Schoedel};
7489af70bce420f011adfeb0f80984b3895c4d7d9bKevin Schoedel
7589af70bce420f011adfeb0f80984b3895c4d7d9bKevin Schoedel}  // namespace dvr
7689af70bce420f011adfeb0f80984b3895c4d7d9bKevin Schoedel}  // namespace android
7789af70bce420f011adfeb0f80984b3895c4d7d9bKevin Schoedel
7889af70bce420f011adfeb0f80984b3895c4d7d9bKevin Schoedel#endif  // ANDROID_DVR_VIRTUAL_TOUCHPAD_INTERFACE_H
79