OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "content/browser/renderer_host/input/motion_event_android.h" | 5 #include "content/browser/renderer_host/input/motion_event_android.h" |
6 | 6 |
7 #include "base/android/jni_android.h" | 7 #include "base/android/jni_android.h" |
8 #include "jni/MotionEvent_jni.h" | 8 #include "jni/MotionEvent_jni.h" |
9 | 9 |
10 using base::android::AttachCurrentThread; | 10 using base::android::AttachCurrentThread; |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
57 int64 ToAndroidTime(base::TimeTicks time) { | 57 int64 ToAndroidTime(base::TimeTicks time) { |
58 return (time - base::TimeTicks()).InMilliseconds(); | 58 return (time - base::TimeTicks()).InMilliseconds(); |
59 } | 59 } |
60 | 60 |
61 base::TimeTicks FromAndroidTime(int64 time_ms) { | 61 base::TimeTicks FromAndroidTime(int64 time_ms) { |
62 return base::TimeTicks() + base::TimeDelta::FromMilliseconds(time_ms); | 62 return base::TimeTicks() + base::TimeDelta::FromMilliseconds(time_ms); |
63 } | 63 } |
64 | 64 |
65 } // namespace | 65 } // namespace |
66 | 66 |
67 MotionEventAndroid::MotionEventAndroid(JNIEnv* env, | 67 MotionEventAndroid::MotionEventAndroid(float pix_to_dip, |
| 68 JNIEnv* env, |
68 jobject event, | 69 jobject event, |
69 jlong time_ms, | 70 jlong time_ms, |
70 jint android_action, | 71 jint android_action, |
71 jint pointer_count, | 72 jint pointer_count, |
72 jint history_size, | 73 jint history_size, |
73 jint action_index, | 74 jint action_index, |
74 jfloat pos_x_0, | 75 jfloat pos_x_0_pixels, |
75 jfloat pos_y_0, | 76 jfloat pos_y_0_pixels, |
76 jfloat pos_x_1, | 77 jfloat pos_x_1_pixels, |
77 jfloat pos_y_1, | 78 jfloat pos_y_1_pixels, |
78 jint pointer_id_0, | 79 jint pointer_id_0, |
79 jint pointer_id_1, | 80 jint pointer_id_1, |
80 jfloat touch_major_0, | 81 jfloat touch_major_0_pixels, |
81 jfloat touch_major_1) | 82 jfloat touch_major_1_pixels) |
82 : cached_time_(FromAndroidTime(time_ms)), | 83 : cached_time_(FromAndroidTime(time_ms)), |
83 cached_action_(FromAndroidAction(android_action)), | 84 cached_action_(FromAndroidAction(android_action)), |
84 cached_pointer_count_(pointer_count), | 85 cached_pointer_count_(pointer_count), |
85 cached_history_size_(history_size), | 86 cached_history_size_(history_size), |
86 cached_action_index_(action_index), | 87 cached_action_index_(action_index), |
| 88 pix_to_dip_(pix_to_dip), |
87 should_recycle_(false) { | 89 should_recycle_(false) { |
88 DCHECK_GT(pointer_count, 0); | 90 DCHECK_GT(pointer_count, 0); |
89 DCHECK_GE(history_size, 0); | 91 DCHECK_GE(history_size, 0); |
90 | 92 |
91 event_.Reset(env, event); | 93 event_.Reset(env, event); |
92 DCHECK(event_.obj()); | 94 DCHECK(event_.obj()); |
93 | 95 |
94 cached_positions_[0] = gfx::PointF(pos_x_0, pos_y_0); | 96 cached_positions_[0] = ToDips(gfx::PointF(pos_x_0_pixels, pos_y_0_pixels)); |
95 cached_positions_[1] = gfx::PointF(pos_x_1, pos_y_1); | 97 cached_positions_[1] = ToDips(gfx::PointF(pos_x_1_pixels, pos_y_1_pixels)); |
96 cached_pointer_ids_[0] = pointer_id_0; | 98 cached_pointer_ids_[0] = pointer_id_0; |
97 cached_pointer_ids_[1] = pointer_id_1; | 99 cached_pointer_ids_[1] = pointer_id_1; |
98 cached_touch_majors_[0] = touch_major_0; | 100 cached_touch_majors_[0] = ToDips(touch_major_0_pixels); |
99 cached_touch_majors_[1] = touch_major_1; | 101 cached_touch_majors_[1] = ToDips(touch_major_1_pixels); |
100 } | 102 } |
101 | 103 |
102 MotionEventAndroid::MotionEventAndroid(JNIEnv* env, jobject event) | 104 MotionEventAndroid::MotionEventAndroid(float pix_to_dip, |
| 105 JNIEnv* env, |
| 106 jobject event) |
103 : cached_time_(FromAndroidTime(Java_MotionEvent_getEventTime(env, event))), | 107 : cached_time_(FromAndroidTime(Java_MotionEvent_getEventTime(env, event))), |
104 cached_action_(FromAndroidAction( | 108 cached_action_( |
105 Java_MotionEvent_getActionMasked(env, event))), | 109 FromAndroidAction(Java_MotionEvent_getActionMasked(env, event))), |
106 cached_pointer_count_(Java_MotionEvent_getPointerCount(env, event)), | 110 cached_pointer_count_(Java_MotionEvent_getPointerCount(env, event)), |
107 cached_history_size_(Java_MotionEvent_getHistorySize(env, event)), | 111 cached_history_size_(Java_MotionEvent_getHistorySize(env, event)), |
108 cached_action_index_(Java_MotionEvent_getActionIndex(env, event)), | 112 cached_action_index_(Java_MotionEvent_getActionIndex(env, event)), |
| 113 pix_to_dip_(pix_to_dip), |
109 should_recycle_(true) { | 114 should_recycle_(true) { |
110 event_.Reset(env, event); | 115 event_.Reset(env, event); |
111 DCHECK(event_.obj()); | 116 DCHECK(event_.obj()); |
112 | 117 |
113 for (size_t i = 0; i < MAX_POINTERS_TO_CACHE; ++i) { | 118 for (size_t i = 0; i < MAX_POINTERS_TO_CACHE; ++i) { |
114 if (i < cached_pointer_count_) { | 119 if (i < cached_pointer_count_) { |
115 cached_positions_[i].set_x(Java_MotionEvent_getXF_I(env, event, i)); | 120 cached_positions_[i] = |
116 cached_positions_[i].set_y(Java_MotionEvent_getYF_I(env, event, i)); | 121 ToDips(gfx::PointF(Java_MotionEvent_getXF_I(env, event, i), |
| 122 Java_MotionEvent_getYF_I(env, event, i))); |
117 cached_pointer_ids_[i] = Java_MotionEvent_getPointerId(env, event, i); | 123 cached_pointer_ids_[i] = Java_MotionEvent_getPointerId(env, event, i); |
118 cached_touch_majors_[i] = | 124 cached_touch_majors_[i] = |
119 Java_MotionEvent_getTouchMajorF_I(env, event, i); | 125 ToDips(Java_MotionEvent_getTouchMajorF_I(env, event, i)); |
120 } else { | 126 } else { |
121 cached_pointer_ids_[i] = 0; | 127 cached_pointer_ids_[i] = 0; |
122 cached_touch_majors_[i] = 0.f; | 128 cached_touch_majors_[i] = 0.f; |
123 } | 129 } |
124 } | 130 } |
125 } | 131 } |
126 | 132 |
127 MotionEventAndroid::MotionEventAndroid(const MotionEventAndroid& other) | 133 MotionEventAndroid::MotionEventAndroid(const MotionEventAndroid& other) |
128 : event_(Obtain(other)), | 134 : event_(Obtain(other)), |
129 cached_time_(other.cached_time_), | 135 cached_time_(other.cached_time_), |
130 cached_action_(other.cached_action_), | 136 cached_action_(other.cached_action_), |
131 cached_pointer_count_(other.cached_pointer_count_), | 137 cached_pointer_count_(other.cached_pointer_count_), |
132 cached_history_size_(other.cached_history_size_), | 138 cached_history_size_(other.cached_history_size_), |
133 cached_action_index_(other.cached_action_index_), | 139 cached_action_index_(other.cached_action_index_), |
| 140 pix_to_dip_(other.pix_to_dip_), |
134 should_recycle_(true) { | 141 should_recycle_(true) { |
135 DCHECK(event_.obj()); | 142 DCHECK(event_.obj()); |
136 for (size_t i = 0; i < MAX_POINTERS_TO_CACHE; ++i) { | 143 for (size_t i = 0; i < MAX_POINTERS_TO_CACHE; ++i) { |
137 cached_positions_[i] = other.cached_positions_[i]; | 144 cached_positions_[i] = other.cached_positions_[i]; |
138 cached_pointer_ids_[i] = other.cached_pointer_ids_[i]; | 145 cached_pointer_ids_[i] = other.cached_pointer_ids_[i]; |
139 cached_touch_majors_[i] = other.cached_touch_majors_[i]; | 146 cached_touch_majors_[i] = other.cached_touch_majors_[i]; |
140 } | 147 } |
141 } | 148 } |
142 | 149 |
143 MotionEventAndroid::~MotionEventAndroid() { | 150 MotionEventAndroid::~MotionEventAndroid() { |
144 if (should_recycle_) | 151 if (should_recycle_) |
145 Java_MotionEvent_recycle(AttachCurrentThread(), event_.obj()); | 152 Java_MotionEvent_recycle(AttachCurrentThread(), event_.obj()); |
146 } | 153 } |
147 | 154 |
148 int MotionEventAndroid::GetId() const { | 155 int MotionEventAndroid::GetId() const { |
149 return 0; | 156 return 0; |
150 } | 157 } |
151 | 158 |
152 MotionEventAndroid::Action MotionEventAndroid::GetAction() const { | 159 MotionEventAndroid::Action MotionEventAndroid::GetAction() const { |
153 return cached_action_; | 160 return cached_action_; |
154 } | 161 } |
155 | 162 |
156 int MotionEventAndroid::GetActionIndex() const { | 163 int MotionEventAndroid::GetActionIndex() const { return cached_action_index_; } |
157 return cached_action_index_; | |
158 } | |
159 | 164 |
160 size_t MotionEventAndroid::GetPointerCount() const { | 165 size_t MotionEventAndroid::GetPointerCount() const { |
161 return cached_pointer_count_; | 166 return cached_pointer_count_; |
162 } | 167 } |
163 | 168 |
164 int MotionEventAndroid::GetPointerId(size_t pointer_index) const { | 169 int MotionEventAndroid::GetPointerId(size_t pointer_index) const { |
165 DCHECK_LT(pointer_index, cached_pointer_count_); | 170 DCHECK_LT(pointer_index, cached_pointer_count_); |
166 if (pointer_index < MAX_POINTERS_TO_CACHE) | 171 if (pointer_index < MAX_POINTERS_TO_CACHE) |
167 return cached_pointer_ids_[pointer_index]; | 172 return cached_pointer_ids_[pointer_index]; |
168 return Java_MotionEvent_getPointerId( | 173 return Java_MotionEvent_getPointerId( |
169 AttachCurrentThread(), event_.obj(), pointer_index); | 174 AttachCurrentThread(), event_.obj(), pointer_index); |
170 } | 175 } |
171 | 176 |
172 float MotionEventAndroid::GetX(size_t pointer_index) const { | 177 float MotionEventAndroid::GetX(size_t pointer_index) const { |
173 DCHECK_LT(pointer_index, cached_pointer_count_); | 178 DCHECK_LT(pointer_index, cached_pointer_count_); |
174 if (pointer_index < MAX_POINTERS_TO_CACHE) | 179 if (pointer_index < MAX_POINTERS_TO_CACHE) |
175 return cached_positions_[pointer_index].x(); | 180 return cached_positions_[pointer_index].x(); |
176 return Java_MotionEvent_getXF_I( | 181 return ToDips(Java_MotionEvent_getXF_I( |
177 AttachCurrentThread(), event_.obj(), pointer_index); | 182 AttachCurrentThread(), event_.obj(), pointer_index)); |
178 } | 183 } |
179 | 184 |
180 float MotionEventAndroid::GetY(size_t pointer_index) const { | 185 float MotionEventAndroid::GetY(size_t pointer_index) const { |
181 DCHECK_LT(pointer_index, cached_pointer_count_); | 186 DCHECK_LT(pointer_index, cached_pointer_count_); |
182 if (pointer_index < MAX_POINTERS_TO_CACHE) | 187 if (pointer_index < MAX_POINTERS_TO_CACHE) |
183 return cached_positions_[pointer_index].y(); | 188 return cached_positions_[pointer_index].y(); |
184 return Java_MotionEvent_getYF_I( | 189 return ToDips(Java_MotionEvent_getYF_I( |
185 AttachCurrentThread(), event_.obj(), pointer_index); | 190 AttachCurrentThread(), event_.obj(), pointer_index)); |
186 } | 191 } |
187 | 192 |
188 float MotionEventAndroid::GetTouchMajor(size_t pointer_index) const { | 193 float MotionEventAndroid::GetTouchMajor(size_t pointer_index) const { |
189 DCHECK_LT(pointer_index, cached_pointer_count_); | 194 DCHECK_LT(pointer_index, cached_pointer_count_); |
190 if (pointer_index < MAX_POINTERS_TO_CACHE) | 195 if (pointer_index < MAX_POINTERS_TO_CACHE) |
191 return cached_touch_majors_[pointer_index]; | 196 return cached_touch_majors_[pointer_index]; |
192 return Java_MotionEvent_getTouchMajorF_I( | 197 return ToDips(Java_MotionEvent_getTouchMajorF_I( |
193 AttachCurrentThread(), event_.obj(), pointer_index); | 198 AttachCurrentThread(), event_.obj(), pointer_index)); |
194 } | 199 } |
195 | 200 |
196 float MotionEventAndroid::GetPressure(size_t pointer_index) const { | 201 float MotionEventAndroid::GetPressure(size_t pointer_index) const { |
197 DCHECK_LT(pointer_index, cached_pointer_count_); | 202 DCHECK_LT(pointer_index, cached_pointer_count_); |
198 return Java_MotionEvent_getPressureF_I( | 203 return Java_MotionEvent_getPressureF_I( |
199 AttachCurrentThread(), event_.obj(), pointer_index); | 204 AttachCurrentThread(), event_.obj(), pointer_index); |
200 } | 205 } |
201 | 206 |
202 base::TimeTicks MotionEventAndroid::GetEventTime() const { | 207 base::TimeTicks MotionEventAndroid::GetEventTime() const { |
203 return cached_time_; | 208 return cached_time_; |
204 } | 209 } |
205 | 210 |
206 size_t MotionEventAndroid::GetHistorySize() const { | 211 size_t MotionEventAndroid::GetHistorySize() const { |
207 return cached_history_size_; | 212 return cached_history_size_; |
208 } | 213 } |
209 | 214 |
210 base::TimeTicks MotionEventAndroid::GetHistoricalEventTime( | 215 base::TimeTicks MotionEventAndroid::GetHistoricalEventTime( |
211 size_t historical_index) const { | 216 size_t historical_index) const { |
212 return FromAndroidTime(Java_MotionEvent_getHistoricalEventTime( | 217 return FromAndroidTime(Java_MotionEvent_getHistoricalEventTime( |
213 AttachCurrentThread(), event_.obj(), historical_index)); | 218 AttachCurrentThread(), event_.obj(), historical_index)); |
214 } | 219 } |
215 | 220 |
216 float MotionEventAndroid::GetHistoricalTouchMajor(size_t pointer_index, | 221 float MotionEventAndroid::GetHistoricalTouchMajor( |
217 size_t historical_index) | 222 size_t pointer_index, |
218 const { | 223 size_t historical_index) const { |
219 return Java_MotionEvent_getHistoricalTouchMajorF_I_I( | 224 return ToDips(Java_MotionEvent_getHistoricalTouchMajorF_I_I( |
220 AttachCurrentThread(), event_.obj(), pointer_index, historical_index); | 225 AttachCurrentThread(), event_.obj(), pointer_index, historical_index)); |
221 } | 226 } |
222 | 227 |
223 float MotionEventAndroid::GetHistoricalX(size_t pointer_index, | 228 float MotionEventAndroid::GetHistoricalX(size_t pointer_index, |
224 size_t historical_index) const { | 229 size_t historical_index) const { |
225 return Java_MotionEvent_getHistoricalXF_I_I( | 230 return ToDips(Java_MotionEvent_getHistoricalXF_I_I( |
226 AttachCurrentThread(), event_.obj(), pointer_index, historical_index); | 231 AttachCurrentThread(), event_.obj(), pointer_index, historical_index)); |
227 } | 232 } |
228 | 233 |
229 float MotionEventAndroid::GetHistoricalY(size_t pointer_index, | 234 float MotionEventAndroid::GetHistoricalY(size_t pointer_index, |
230 size_t historical_index) const { | 235 size_t historical_index) const { |
231 return Java_MotionEvent_getHistoricalYF_I_I( | 236 return ToDips(Java_MotionEvent_getHistoricalYF_I_I( |
232 AttachCurrentThread(), event_.obj(), pointer_index, historical_index); | 237 AttachCurrentThread(), event_.obj(), pointer_index, historical_index)); |
233 } | 238 } |
234 | 239 |
235 scoped_ptr<ui::MotionEvent> MotionEventAndroid::Clone() const { | 240 scoped_ptr<ui::MotionEvent> MotionEventAndroid::Clone() const { |
236 return scoped_ptr<MotionEvent>(new MotionEventAndroid(*this)); | 241 return scoped_ptr<MotionEvent>(new MotionEventAndroid(*this)); |
237 } | 242 } |
238 | 243 |
239 scoped_ptr<ui::MotionEvent> MotionEventAndroid::Cancel() const { | 244 scoped_ptr<ui::MotionEvent> MotionEventAndroid::Cancel() const { |
240 return scoped_ptr<MotionEvent>(new MotionEventAndroid( | 245 // The input coordinates to |MotionEventAndroid| are always in device pixels, |
241 AttachCurrentThread(), | 246 // but the cached coordinates are in DIPs. |
242 Obtain(GetDownTime(), | 247 const gfx::PointF position_pixels = |
243 GetEventTime(), | 248 gfx::ScalePoint(cached_positions_[0], 1.f / pix_to_dip_); |
244 MotionEventAndroid::ACTION_CANCEL, | 249 return scoped_ptr<MotionEvent>( |
245 GetX(0), | 250 new MotionEventAndroid(pix_to_dip_, |
246 GetY(0)).obj())); | 251 AttachCurrentThread(), |
| 252 Obtain(GetDownTime(), |
| 253 GetEventTime(), |
| 254 MotionEventAndroid::ACTION_CANCEL, |
| 255 position_pixels.x(), |
| 256 position_pixels.y()).obj())); |
247 } | 257 } |
248 | 258 |
249 float MotionEventAndroid::GetTouchMinor(size_t pointer_index) const { | 259 float MotionEventAndroid::GetTouchMinor(size_t pointer_index) const { |
250 return Java_MotionEvent_getTouchMinorF_I( | 260 return ToDips(Java_MotionEvent_getTouchMinorF_I( |
251 AttachCurrentThread(), event_.obj(), pointer_index); | 261 AttachCurrentThread(), event_.obj(), pointer_index)); |
252 } | 262 } |
253 | 263 |
254 float MotionEventAndroid::GetOrientation() const { | 264 float MotionEventAndroid::GetOrientation() const { |
255 return Java_MotionEvent_getOrientationF(AttachCurrentThread(), event_.obj()); | 265 return Java_MotionEvent_getOrientationF(AttachCurrentThread(), event_.obj()); |
256 } | 266 } |
257 | 267 |
258 base::TimeTicks MotionEventAndroid::GetDownTime() const { | 268 base::TimeTicks MotionEventAndroid::GetDownTime() const { |
259 return FromAndroidTime( | 269 return FromAndroidTime( |
260 Java_MotionEvent_getDownTime(AttachCurrentThread(), event_.obj())); | 270 Java_MotionEvent_getDownTime(AttachCurrentThread(), event_.obj())); |
261 } | 271 } |
262 | 272 |
| 273 float MotionEventAndroid::ToDips(float pixels) const { |
| 274 return pixels * pix_to_dip_; |
| 275 } |
| 276 |
| 277 gfx::PointF MotionEventAndroid::ToDips(const gfx::PointF& point_pixels) const { |
| 278 return gfx::ScalePoint(point_pixels, pix_to_dip_); |
| 279 } |
| 280 |
263 // static | 281 // static |
264 bool MotionEventAndroid::RegisterMotionEventAndroid(JNIEnv* env) { | 282 bool MotionEventAndroid::RegisterMotionEventAndroid(JNIEnv* env) { |
265 return JNI_MotionEvent::RegisterNativesImpl(env); | 283 return JNI_MotionEvent::RegisterNativesImpl(env); |
266 } | 284 } |
267 | 285 |
268 // static | 286 // static |
269 base::android::ScopedJavaLocalRef<jobject> MotionEventAndroid::Obtain( | 287 base::android::ScopedJavaLocalRef<jobject> MotionEventAndroid::Obtain( |
270 const MotionEventAndroid& event) { | 288 const MotionEventAndroid& event) { |
271 return Java_MotionEvent_obtainAVME_AVME(AttachCurrentThread(), | 289 return Java_MotionEvent_obtainAVME_AVME(AttachCurrentThread(), |
272 event.event_.obj()); | 290 event.event_.obj()); |
273 } | 291 } |
274 | 292 |
275 // static | 293 // static |
276 base::android::ScopedJavaLocalRef<jobject> MotionEventAndroid::Obtain( | 294 base::android::ScopedJavaLocalRef<jobject> MotionEventAndroid::Obtain( |
277 base::TimeTicks down_time, | 295 base::TimeTicks down_time, |
278 base::TimeTicks event_time, | 296 base::TimeTicks event_time, |
279 Action action, | 297 Action action, |
280 float x, | 298 float x_pixels, |
281 float y) { | 299 float y_pixels) { |
282 return Java_MotionEvent_obtainAVME_J_J_I_F_F_I(AttachCurrentThread(), | 300 return Java_MotionEvent_obtainAVME_J_J_I_F_F_I(AttachCurrentThread(), |
283 ToAndroidTime(down_time), | 301 ToAndroidTime(down_time), |
284 ToAndroidTime(event_time), | 302 ToAndroidTime(event_time), |
285 ToAndroidAction(action), | 303 ToAndroidAction(action), |
286 x, | 304 x_pixels, |
287 y, | 305 y_pixels, |
288 0); | 306 0); |
289 } | 307 } |
290 | 308 |
291 } // namespace content | 309 } // namespace content |
OLD | NEW |