summaryrefslogtreecommitdiff
path: root/chromium/content/browser/renderer_host/input/motion_event_android.h
blob: 4af9f72e00b2557ac841ec7565d665415dc212b1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131

// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef CONTENT_BROWSER_RENDERER_HOST_INPUT_MOTION_EVENT_ANDROID_H_
#define CONTENT_BROWSER_RENDERER_HOST_INPUT_MOTION_EVENT_ANDROID_H_

#include <jni.h>

#include "base/android/scoped_java_ref.h"
#include "base/memory/scoped_ptr.h"
#include "base/time/time.h"
#include "content/common/content_export.h"
#include "ui/events/gesture_detection/motion_event.h"
#include "ui/gfx/geometry/point_f.h"

namespace content {

// Implementation of ui::MotionEvent wrapping a native Android MotionEvent.
// All *input* coordinates are in device pixels (as with Android MotionEvent),
// while all *output* coordinates are in DIPs (as with WebTouchEvent).
class CONTENT_EXPORT MotionEventAndroid : public ui::MotionEvent {
 public:
  struct Pointer {
    Pointer(jint id,
            jfloat pos_x_pixels,
            jfloat pos_y_pixels,
            jfloat touch_major_pixels,
            jfloat touch_minor_pixels,
            jfloat orientation_rad,
            jint tool_type);
    jint id;
    jfloat pos_x_pixels;
    jfloat pos_y_pixels;
    jfloat touch_major_pixels;
    jfloat touch_minor_pixels;
    jfloat orientation_rad;
    jint tool_type;
  };

  // Forcing the caller to provide all cached values upon construction
  // eliminates the need to perform a JNI call to retrieve values individually.
  MotionEventAndroid(float pix_to_dip,
                     JNIEnv* env,
                     jobject event,
                     jlong time_ms,
                     jint android_action,
                     jint pointer_count,
                     jint history_size,
                     jint action_index,
                     jint android_button_state,
                     jint meta_state,
                     jfloat raw_offset_x_pixels,
                     jfloat raw_offset_y_pixels,
                     const Pointer& pointer0,
                     const Pointer& pointer1);
  virtual ~MotionEventAndroid();

  // ui::MotionEvent methods.
  virtual int GetId() const override;
  virtual Action GetAction() const override;
  virtual int GetActionIndex() const override;
  virtual size_t GetPointerCount() const override;
  virtual int GetPointerId(size_t pointer_index) const override;
  virtual float GetX(size_t pointer_index) const override;
  virtual float GetY(size_t pointer_index) const override;
  virtual float GetRawX(size_t pointer_index) const override;
  virtual float GetRawY(size_t pointer_index) const override;
  virtual float GetTouchMajor(size_t pointer_index) const override;
  virtual float GetTouchMinor(size_t pointer_index) const override;
  virtual float GetOrientation(size_t pointer_index) const override;
  virtual float GetPressure(size_t pointer_index) const override;
  virtual base::TimeTicks GetEventTime() const override;
  virtual size_t GetHistorySize() const override;
  virtual base::TimeTicks GetHistoricalEventTime(
      size_t historical_index) const override;
  virtual float GetHistoricalTouchMajor(size_t pointer_index,
                                        size_t historical_index) const override;
  virtual float GetHistoricalX(size_t pointer_index,
                               size_t historical_index) const override;
  virtual float GetHistoricalY(size_t pointer_index,
                               size_t historical_index) const override;
  virtual ToolType GetToolType(size_t pointer_index) const override;
  virtual int GetButtonState() const override;
  virtual int GetFlags() const override;

  static bool RegisterMotionEventAndroid(JNIEnv* env);

 private:
  struct CachedPointer;

  float ToDips(float pixels) const;
  CachedPointer FromAndroidPointer(const Pointer& pointer) const;

  // Cache pointer coords, id's and major lengths for the most common
  // touch-related scenarios, i.e., scrolling and pinching.  This prevents
  // redundant JNI fetches for the same bits.
  enum { MAX_POINTERS_TO_CACHE = 2 };

  // The Java reference to the underlying MotionEvent.
  base::android::ScopedJavaGlobalRef<jobject> event_;

  // Used to convert pixel coordinates from the Java-backed MotionEvent to
  // DIP coordinates cached/returned by the MotionEventAndroid.
  const float pix_to_dip_;

  const base::TimeTicks cached_time_;
  const Action cached_action_;
  const size_t cached_pointer_count_;
  const size_t cached_history_size_;
  const int cached_action_index_;
  const int cached_button_state_;
  const int cached_flags_;
  const gfx::Vector2dF cached_raw_position_offset_;
  struct CachedPointer {
    CachedPointer();
    int id;
    gfx::PointF position;
    float touch_major;
    float touch_minor;
    float orientation;
    ToolType tool_type;
  } cached_pointers_[MAX_POINTERS_TO_CACHE];

  DISALLOW_COPY_AND_ASSIGN(MotionEventAndroid);
};

}  // namespace content

#endif  // CONTENT_BROWSER_RENDERER_HOST_INPUT_MOTION_EVENT_ANDROID_H_