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.
5 #include "content/browser/renderer_host/input/motion_event_android.h"
7 #include "base/android/jni_android.h"
8 #include "jni/MotionEvent_jni.h"
10 using base::android::AttachCurrentThread;
11 using namespace JNI_MotionEvent;
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);
26 NOTREACHED() << "Invalid Android MotionEvent type for gesture detection: "
29 return MotionEventAndroid::ACTION_CANCEL;
32 int64 ToAndroidTime(base::TimeTicks time) {
33 return (time - base::TimeTicks()).InMilliseconds();
36 base::TimeTicks FromAndroidTime(int64 time_ms) {
37 return base::TimeTicks() + base::TimeDelta::FromMilliseconds(time_ms);
42 MotionEventAndroid::MotionEventAndroid(jobject event)
43 : should_recycle_(false) {
44 event_.Reset(AttachCurrentThread(), event);
48 MotionEventAndroid::MotionEventAndroid(
49 const base::android::ScopedJavaLocalRef<jobject>& event,
52 should_recycle_(should_recycle) {
56 MotionEventAndroid::~MotionEventAndroid() {
58 Java_MotionEvent_recycle(AttachCurrentThread(), event_.obj());
61 MotionEventAndroid::Action MotionEventAndroid::GetActionMasked() const {
62 return FromAndroidAction(
63 Java_MotionEvent_getActionMasked(AttachCurrentThread(), event_.obj()));
66 size_t MotionEventAndroid::GetActionIndex() const {
67 return Java_MotionEvent_getActionIndex(AttachCurrentThread(), event_.obj());
70 size_t MotionEventAndroid::GetPointerCount() const {
71 return Java_MotionEvent_getPointerCount(AttachCurrentThread(), event_.obj());
74 int MotionEventAndroid::GetPointerId(size_t pointer_index) const {
75 return Java_MotionEvent_getPointerId(
76 AttachCurrentThread(), event_.obj(), pointer_index);
79 float MotionEventAndroid::GetPressure(size_t pointer_index) const {
80 return Java_MotionEvent_getPressureF_I(
81 AttachCurrentThread(), event_.obj(), pointer_index);
84 float MotionEventAndroid::GetX(size_t pointer_index) const {
85 return Java_MotionEvent_getXF_I(
86 AttachCurrentThread(), event_.obj(), pointer_index);
89 float MotionEventAndroid::GetY(size_t pointer_index) const {
90 return Java_MotionEvent_getYF_I(
91 AttachCurrentThread(), event_.obj(), pointer_index);
94 float MotionEventAndroid::GetTouchMajor(size_t pointer_index) const {
95 return Java_MotionEvent_getTouchMajorF_I(
96 AttachCurrentThread(), event_.obj(), pointer_index);
99 float MotionEventAndroid::GetTouchMinor(size_t pointer_index) const {
100 return Java_MotionEvent_getTouchMinorF_I(
101 AttachCurrentThread(), event_.obj(), pointer_index);
104 float MotionEventAndroid::GetOrientation() const {
105 return Java_MotionEvent_getOrientationF(AttachCurrentThread(), event_.obj());
108 base::TimeTicks MotionEventAndroid::GetEventTime() const {
109 return FromAndroidTime(
110 Java_MotionEvent_getEventTime(AttachCurrentThread(), event_.obj()));
113 base::TimeTicks MotionEventAndroid::GetDownTime() const {
114 return FromAndroidTime(
115 Java_MotionEvent_getDownTime(AttachCurrentThread(), event_.obj()));
118 size_t MotionEventAndroid::GetHistorySize() const {
119 return Java_MotionEvent_getHistorySize(AttachCurrentThread(), event_.obj());
122 base::TimeTicks MotionEventAndroid::GetHistoricalEventTime(
123 size_t historical_index) const {
124 return FromAndroidTime(Java_MotionEvent_getHistoricalEventTime(
125 AttachCurrentThread(), event_.obj(), historical_index));
128 float MotionEventAndroid::GetHistoricalTouchMajor(size_t pointer_index,
129 size_t historical_index)
131 return Java_MotionEvent_getHistoricalTouchMajorF_I_I(
132 AttachCurrentThread(), event_.obj(), pointer_index, historical_index);
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);
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);
148 bool MotionEventAndroid::RegisterMotionEventAndroid(JNIEnv* env) {
149 return JNI_MotionEvent::RegisterNativesImpl(env);
153 scoped_ptr<MotionEventAndroid> MotionEventAndroid::Obtain(
154 const MotionEventAndroid& event) {
155 return make_scoped_ptr(new MotionEventAndroid(
156 Java_MotionEvent_obtainAVME_AVME(AttachCurrentThread(),
162 scoped_ptr<MotionEventAndroid> MotionEventAndroid::Obtain(
163 base::TimeTicks down_time,
164 base::TimeTicks event__time,
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),
179 } // namespace content