Upstream version 5.34.104.0
[platform/framework/web/crosswalk.git] / src / content / browser / renderer_host / input / motion_event_android.cc
1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "content/browser/renderer_host/input/motion_event_android.h"
6
7 #include "base/android/jni_android.h"
8 #include "jni/MotionEvent_jni.h"
9
10 using base::android::AttachCurrentThread;
11 using namespace JNI_MotionEvent;
12
13 namespace content {
14 namespace {
15
16 MotionEventAndroid::Action FromAndroidAction(int android_action) {
17   switch (android_action) {
18     case MotionEventAndroid::ACTION_DOWN:
19     case MotionEventAndroid::ACTION_UP:
20     case MotionEventAndroid::ACTION_MOVE:
21     case MotionEventAndroid::ACTION_CANCEL:
22     case MotionEventAndroid::ACTION_POINTER_DOWN:
23     case MotionEventAndroid::ACTION_POINTER_UP:
24       return static_cast<MotionEventAndroid::Action>(android_action);
25     default:
26       NOTREACHED() << "Invalid Android MotionEvent type for gesture detection: "
27                    << android_action;
28   };
29   return MotionEventAndroid::ACTION_CANCEL;
30 }
31
32 int64 ToAndroidTime(base::TimeTicks time) {
33   return (time - base::TimeTicks()).InMilliseconds();
34 }
35
36 base::TimeTicks FromAndroidTime(int64 time_ms) {
37   return base::TimeTicks() + base::TimeDelta::FromMilliseconds(time_ms);
38 }
39
40 }  // namespace
41
42 MotionEventAndroid::MotionEventAndroid(jobject event)
43     : should_recycle_(false) {
44   event_.Reset(AttachCurrentThread(), event);
45   DCHECK(event_.obj());
46 }
47
48 MotionEventAndroid::MotionEventAndroid(
49     const base::android::ScopedJavaLocalRef<jobject>& event,
50     bool should_recycle)
51     : event_(event),
52       should_recycle_(should_recycle) {
53   DCHECK(event_.obj());
54 }
55
56 MotionEventAndroid::~MotionEventAndroid() {
57   if (should_recycle_)
58     Java_MotionEvent_recycle(AttachCurrentThread(), event_.obj());
59 }
60
61 MotionEventAndroid::Action MotionEventAndroid::GetActionMasked() const {
62   return FromAndroidAction(
63       Java_MotionEvent_getActionMasked(AttachCurrentThread(), event_.obj()));
64 }
65
66 size_t MotionEventAndroid::GetActionIndex() const {
67   return Java_MotionEvent_getActionIndex(AttachCurrentThread(), event_.obj());
68 }
69
70 size_t MotionEventAndroid::GetPointerCount() const {
71   return Java_MotionEvent_getPointerCount(AttachCurrentThread(), event_.obj());
72 }
73
74 int MotionEventAndroid::GetPointerId(size_t pointer_index) const {
75   return Java_MotionEvent_getPointerId(
76       AttachCurrentThread(), event_.obj(), pointer_index);
77 }
78
79 float MotionEventAndroid::GetPressure(size_t pointer_index) const {
80   return Java_MotionEvent_getPressureF_I(
81       AttachCurrentThread(), event_.obj(), pointer_index);
82 }
83
84 float MotionEventAndroid::GetX(size_t pointer_index) const {
85   return Java_MotionEvent_getXF_I(
86       AttachCurrentThread(), event_.obj(), pointer_index);
87 }
88
89 float MotionEventAndroid::GetY(size_t pointer_index) const {
90   return Java_MotionEvent_getYF_I(
91       AttachCurrentThread(), event_.obj(), pointer_index);
92 }
93
94 float MotionEventAndroid::GetTouchMajor(size_t pointer_index) const {
95   return Java_MotionEvent_getTouchMajorF_I(
96       AttachCurrentThread(), event_.obj(), pointer_index);
97 }
98
99 float MotionEventAndroid::GetTouchMinor(size_t pointer_index) const {
100   return Java_MotionEvent_getTouchMinorF_I(
101       AttachCurrentThread(), event_.obj(), pointer_index);
102 }
103
104 float MotionEventAndroid::GetOrientation() const {
105   return Java_MotionEvent_getOrientationF(AttachCurrentThread(), event_.obj());
106 }
107
108 base::TimeTicks MotionEventAndroid::GetEventTime() const {
109   return FromAndroidTime(
110       Java_MotionEvent_getEventTime(AttachCurrentThread(), event_.obj()));
111 }
112
113 base::TimeTicks MotionEventAndroid::GetDownTime() const {
114   return FromAndroidTime(
115       Java_MotionEvent_getDownTime(AttachCurrentThread(), event_.obj()));
116 }
117
118 size_t MotionEventAndroid::GetHistorySize() const {
119   return Java_MotionEvent_getHistorySize(AttachCurrentThread(), event_.obj());
120 }
121
122 base::TimeTicks MotionEventAndroid::GetHistoricalEventTime(
123     size_t historical_index) const {
124   return FromAndroidTime(Java_MotionEvent_getHistoricalEventTime(
125       AttachCurrentThread(), event_.obj(), historical_index));
126 }
127
128 float MotionEventAndroid::GetHistoricalTouchMajor(size_t pointer_index,
129                                                   size_t historical_index)
130     const {
131   return Java_MotionEvent_getHistoricalTouchMajorF_I_I(
132       AttachCurrentThread(), event_.obj(), pointer_index, historical_index);
133 }
134
135 float MotionEventAndroid::GetHistoricalX(size_t pointer_index,
136                                          size_t historical_index) const {
137   return Java_MotionEvent_getHistoricalXF_I_I(
138       AttachCurrentThread(), event_.obj(), pointer_index, historical_index);
139 }
140
141 float MotionEventAndroid::GetHistoricalY(size_t pointer_index,
142                                          size_t historical_index) const {
143   return Java_MotionEvent_getHistoricalYF_I_I(
144       AttachCurrentThread(), event_.obj(), pointer_index, historical_index);
145 }
146
147 // static
148 bool MotionEventAndroid::RegisterMotionEventAndroid(JNIEnv* env) {
149   return JNI_MotionEvent::RegisterNativesImpl(env);
150 }
151
152 // static
153 scoped_ptr<MotionEventAndroid> MotionEventAndroid::Obtain(
154     const MotionEventAndroid& event) {
155   return make_scoped_ptr(new MotionEventAndroid(
156       Java_MotionEvent_obtainAVME_AVME(AttachCurrentThread(),
157                                        event.event_.obj()),
158       true));
159 }
160
161 // static
162 scoped_ptr<MotionEventAndroid> MotionEventAndroid::Obtain(
163     base::TimeTicks down_time,
164     base::TimeTicks event__time,
165     Action action,
166     float x,
167     float y) {
168   return make_scoped_ptr(new MotionEventAndroid(
169       Java_MotionEvent_obtainAVME_J_J_I_F_F_I(AttachCurrentThread(),
170                                               ToAndroidTime(down_time),
171                                               ToAndroidTime(down_time),
172                                               action,
173                                               x,
174                                               y,
175                                               0),
176       true));
177 }
178
179 }  // namespace content