Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(279)

Side by Side Diff: content/browser/renderer_host/input/motion_event_android.cc

Issue 502993004: Remove abstract Clone and Cancel methods from MotionEvent (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Nasty bug fix Created 6 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 <android/input.h> 7 #include <android/input.h>
8 8
9 #include "base/android/jni_android.h" 9 #include "base/android/jni_android.h"
10 #include "base/float_util.h" 10 #include "base/float_util.h"
11 #include "jni/MotionEvent_jni.h" 11 #include "jni/MotionEvent_jni.h"
12 #include "ui/events/event_constants.h" 12 #include "ui/events/event_constants.h"
13 13
14 using base::android::AttachCurrentThread; 14 using base::android::AttachCurrentThread;
15 using namespace JNI_MotionEvent; 15 using namespace JNI_MotionEvent;
16 16
17 namespace content { 17 namespace content {
18 namespace { 18 namespace {
19 19
20 int ToAndroidAction(MotionEventAndroid::Action action) {
21 switch (action) {
22 case MotionEventAndroid::ACTION_DOWN:
23 return ACTION_DOWN;
24 case MotionEventAndroid::ACTION_UP:
25 return ACTION_UP;
26 case MotionEventAndroid::ACTION_MOVE:
27 return ACTION_MOVE;
28 case MotionEventAndroid::ACTION_CANCEL:
29 return ACTION_CANCEL;
30 case MotionEventAndroid::ACTION_POINTER_DOWN:
31 return ACTION_POINTER_DOWN;
32 case MotionEventAndroid::ACTION_POINTER_UP:
33 return ACTION_POINTER_UP;
34 };
35 NOTREACHED() << "Invalid Android MotionEvent type for gesture detection: "
36 << action;
37 return ACTION_CANCEL;
38 }
39
40 MotionEventAndroid::Action FromAndroidAction(int android_action) { 20 MotionEventAndroid::Action FromAndroidAction(int android_action) {
41 switch (android_action) { 21 switch (android_action) {
42 case ACTION_DOWN: 22 case ACTION_DOWN:
43 return MotionEventAndroid::ACTION_DOWN; 23 return MotionEventAndroid::ACTION_DOWN;
44 case ACTION_UP: 24 case ACTION_UP:
45 return MotionEventAndroid::ACTION_UP; 25 return MotionEventAndroid::ACTION_UP;
46 case ACTION_MOVE: 26 case ACTION_MOVE:
47 return MotionEventAndroid::ACTION_MOVE; 27 return MotionEventAndroid::ACTION_MOVE;
48 case ACTION_CANCEL: 28 case ACTION_CANCEL:
49 return MotionEventAndroid::ACTION_CANCEL; 29 return MotionEventAndroid::ACTION_CANCEL;
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
100 flags |= ui::EF_CONTROL_DOWN; 80 flags |= ui::EF_CONTROL_DOWN;
101 if ((meta_state & AMETA_ALT_ON) != 0) 81 if ((meta_state & AMETA_ALT_ON) != 0)
102 flags |= ui::EF_ALT_DOWN; 82 flags |= ui::EF_ALT_DOWN;
103 if ((meta_state & AMETA_META_ON) != 0) 83 if ((meta_state & AMETA_META_ON) != 0)
104 flags |= ui::EF_COMMAND_DOWN; 84 flags |= ui::EF_COMMAND_DOWN;
105 if ((meta_state & AMETA_CAPS_LOCK_ON) != 0) 85 if ((meta_state & AMETA_CAPS_LOCK_ON) != 0)
106 flags |= ui::EF_CAPS_LOCK_DOWN; 86 flags |= ui::EF_CAPS_LOCK_DOWN;
107 return flags; 87 return flags;
108 } 88 }
109 89
110 int64 ToAndroidTime(base::TimeTicks time) {
111 return (time - base::TimeTicks()).InMilliseconds();
112 }
113
114 base::TimeTicks FromAndroidTime(int64 time_ms) { 90 base::TimeTicks FromAndroidTime(int64 time_ms) {
115 return base::TimeTicks() + base::TimeDelta::FromMilliseconds(time_ms); 91 return base::TimeTicks() + base::TimeDelta::FromMilliseconds(time_ms);
116 } 92 }
117 93
118 float ToValidFloat(float x) { 94 float ToValidFloat(float x) {
119 if (base::IsNaN(x)) 95 if (base::IsNaN(x))
120 return 0.f; 96 return 0.f;
121 97
122 // Wildly large orientation values have been observed in the wild after device 98 // Wildly large orientation values have been observed in the wild after device
123 // rotation. There's not much we can do in that case other than simply 99 // rotation. There's not much we can do in that case other than simply
124 // sanitize results beyond an absurd and arbitrary threshold. 100 // sanitize results beyond an absurd and arbitrary threshold.
125 if (std::abs(x) > 1e5f) 101 if (std::abs(x) > 1e5f)
126 return 0.f; 102 return 0.f;
127 103
128 return x; 104 return x;
129 } 105 }
130 106
131 } // namespace 107 } // namespace
132 108
109 MotionEventAndroid::Pointer::Pointer(jint id,
110 jfloat pos_x_pixels,
111 jfloat pos_y_pixels,
112 jfloat touch_major_pixels,
113 jfloat touch_minor_pixels,
114 jfloat orientation_rad,
115 jint tool_type)
116 : id(id),
117 pos_x_pixels(pos_x_pixels),
118 pos_y_pixels(pos_y_pixels),
119 touch_major_pixels(touch_major_pixels),
120 touch_minor_pixels(touch_minor_pixels),
121 orientation_rad(orientation_rad),
122 tool_type(tool_type) {
123 }
124
125 MotionEventAndroid::CachedPointer::CachedPointer()
126 : id(0),
127 touch_major(0),
128 touch_minor(0),
129 orientation(0),
130 tool_type(TOOL_TYPE_UNKNOWN) {
131 }
132
133 MotionEventAndroid::MotionEventAndroid(float pix_to_dip, 133 MotionEventAndroid::MotionEventAndroid(float pix_to_dip,
134 JNIEnv* env, 134 JNIEnv* env,
135 jobject event, 135 jobject event,
136 jlong time_ms, 136 jlong time_ms,
137 jint android_action, 137 jint android_action,
138 jint pointer_count, 138 jint pointer_count,
139 jint history_size, 139 jint history_size,
140 jint action_index, 140 jint action_index,
141 jfloat pos_x_0_pixels,
142 jfloat pos_y_0_pixels,
143 jfloat pos_x_1_pixels,
144 jfloat pos_y_1_pixels,
145 jint pointer_id_0,
146 jint pointer_id_1,
147 jfloat touch_major_0_pixels,
148 jfloat touch_major_1_pixels,
149 jfloat touch_minor_0_pixels,
150 jfloat touch_minor_1_pixels,
151 jfloat orientation_0_rad,
152 jfloat orientation_1_rad,
153 jfloat raw_pos_x_pixels,
154 jfloat raw_pos_y_pixels,
155 jint android_tool_type_0,
156 jint android_tool_type_1,
157 jint android_button_state, 141 jint android_button_state,
158 jint meta_state) 142 jint meta_state,
159 : cached_time_(FromAndroidTime(time_ms)), 143 jfloat raw_offset_x_pixels,
144 jfloat raw_offset_y_pixels,
145 const Pointer& pointer0,
146 const Pointer& pointer1)
147 : pix_to_dip_(pix_to_dip),
148 cached_time_(FromAndroidTime(time_ms)),
160 cached_action_(FromAndroidAction(android_action)), 149 cached_action_(FromAndroidAction(android_action)),
161 cached_pointer_count_(pointer_count), 150 cached_pointer_count_(pointer_count),
162 cached_history_size_(history_size), 151 cached_history_size_(history_size),
163 cached_action_index_(action_index), 152 cached_action_index_(action_index),
164 cached_button_state_(FromAndroidButtonState(android_button_state)), 153 cached_button_state_(FromAndroidButtonState(android_button_state)),
165 cached_flags_(FromAndroidMetaState(meta_state)), 154 cached_flags_(FromAndroidMetaState(meta_state)),
166 pix_to_dip_(pix_to_dip), 155 cached_raw_position_offset_(ToDips(raw_offset_x_pixels),
167 should_recycle_(false) { 156 ToDips(raw_offset_y_pixels)) {
168 DCHECK_GT(pointer_count, 0); 157 DCHECK_GT(pointer_count, 0);
169 DCHECK_GE(history_size, 0); 158 DCHECK_GE(history_size, 0);
170 159
171 event_.Reset(env, event); 160 event_.Reset(env, event);
172 DCHECK(event_.obj()); 161 if (cached_pointer_count_ > MAX_POINTERS_TO_CACHE || history_size > 0)
162 DCHECK(event_.obj());
173 163
174 cached_positions_[0] = ToDips(gfx::PointF(pos_x_0_pixels, pos_y_0_pixels)); 164 cached_pointers_[0] = FromAndroidPointer(pointer0);
175 cached_positions_[1] = ToDips(gfx::PointF(pos_x_1_pixels, pos_y_1_pixels)); 165 cached_pointers_[1] = FromAndroidPointer(pointer1);
176 cached_pointer_ids_[0] = pointer_id_0;
177 cached_pointer_ids_[1] = pointer_id_1;
178 cached_touch_majors_[0] = ToDips(touch_major_0_pixels);
179 cached_touch_majors_[1] = ToDips(touch_major_1_pixels);
180 cached_touch_minors_[0] = ToDips(touch_minor_0_pixels);
181 cached_touch_minors_[1] = ToDips(touch_minor_1_pixels);
182 cached_orientations_[0] = ToValidFloat(orientation_0_rad);
183 cached_orientations_[1] = ToValidFloat(orientation_1_rad);
184 cached_raw_position_offset_ =
185 ToDips(gfx::PointF(raw_pos_x_pixels, raw_pos_y_pixels)) -
186 cached_positions_[0];
187 cached_tool_types_[0] = FromAndroidToolType(android_tool_type_0);
188 cached_tool_types_[1] = FromAndroidToolType(android_tool_type_1);
189 }
190
191 MotionEventAndroid::MotionEventAndroid(float pix_to_dip,
192 JNIEnv* env,
193 jobject event)
194 : cached_time_(FromAndroidTime(Java_MotionEvent_getEventTime(env, event))),
195 cached_action_(
196 FromAndroidAction(Java_MotionEvent_getActionMasked(env, event))),
197 cached_pointer_count_(Java_MotionEvent_getPointerCount(env, event)),
198 cached_history_size_(Java_MotionEvent_getHistorySize(env, event)),
199 cached_action_index_(Java_MotionEvent_getActionIndex(env, event)),
200 cached_button_state_(
201 FromAndroidButtonState(Java_MotionEvent_getButtonState(env, event))),
202 cached_flags_(
203 FromAndroidMetaState(Java_MotionEvent_getMetaState(env, event))),
204 pix_to_dip_(pix_to_dip),
205 should_recycle_(true) {
206 event_.Reset(env, event);
207 DCHECK(event_.obj());
208
209 for (size_t i = 0; i < MAX_POINTERS_TO_CACHE; ++i) {
210 if (i < cached_pointer_count_) {
211 cached_positions_[i] =
212 ToDips(gfx::PointF(Java_MotionEvent_getXF_I(env, event, i),
213 Java_MotionEvent_getYF_I(env, event, i)));
214 cached_pointer_ids_[i] = Java_MotionEvent_getPointerId(env, event, i);
215 cached_touch_majors_[i] =
216 ToDips(Java_MotionEvent_getTouchMajorF_I(env, event, i));
217 cached_touch_minors_[i] =
218 ToDips(Java_MotionEvent_getTouchMinorF_I(env, event, i));
219 cached_orientations_[i] =
220 ToValidFloat(Java_MotionEvent_getOrientationF_I(env, event, i));
221 cached_tool_types_[i] =
222 FromAndroidToolType(Java_MotionEvent_getToolType(env, event, i));
223 } else {
224 cached_pointer_ids_[i] = 0;
225 cached_touch_majors_[i] = 0.f;
226 cached_touch_minors_[i] = 0.f;
227 cached_orientations_[i] = 0.f;
228 cached_tool_types_[i] = MotionEvent::TOOL_TYPE_UNKNOWN;
229 }
230 }
231
232 cached_raw_position_offset_ =
233 ToDips(gfx::PointF(Java_MotionEvent_getRawX(env, event),
234 Java_MotionEvent_getRawY(env, event))) -
235 cached_positions_[0];
236 }
237
238 MotionEventAndroid::MotionEventAndroid(const MotionEventAndroid& other)
239 : event_(Obtain(other)),
240 cached_time_(other.cached_time_),
241 cached_action_(other.cached_action_),
242 cached_pointer_count_(other.cached_pointer_count_),
243 cached_history_size_(other.cached_history_size_),
244 cached_action_index_(other.cached_action_index_),
245 cached_raw_position_offset_(other.cached_raw_position_offset_),
246 cached_button_state_(other.cached_button_state_),
247 cached_flags_(other.cached_flags_),
248 pix_to_dip_(other.pix_to_dip_),
249 should_recycle_(true) {
250 DCHECK(event_.obj());
251 for (size_t i = 0; i < MAX_POINTERS_TO_CACHE; ++i) {
252 cached_positions_[i] = other.cached_positions_[i];
253 cached_pointer_ids_[i] = other.cached_pointer_ids_[i];
254 cached_touch_majors_[i] = other.cached_touch_majors_[i];
255 cached_touch_minors_[i] = other.cached_touch_minors_[i];
256 cached_orientations_[i] = other.cached_orientations_[i];
257 cached_tool_types_[i] = other.cached_tool_types_[i];
258 }
259 } 166 }
260 167
261 MotionEventAndroid::~MotionEventAndroid() { 168 MotionEventAndroid::~MotionEventAndroid() {
262 if (should_recycle_)
263 Java_MotionEvent_recycle(AttachCurrentThread(), event_.obj());
264 } 169 }
265 170
266 int MotionEventAndroid::GetId() const { 171 int MotionEventAndroid::GetId() const {
267 return 0; 172 return 0;
268 } 173 }
269 174
270 MotionEventAndroid::Action MotionEventAndroid::GetAction() const { 175 MotionEventAndroid::Action MotionEventAndroid::GetAction() const {
271 return cached_action_; 176 return cached_action_;
272 } 177 }
273 178
274 int MotionEventAndroid::GetActionIndex() const { 179 int MotionEventAndroid::GetActionIndex() const {
275 return cached_action_index_; 180 return cached_action_index_;
276 } 181 }
277 182
278 size_t MotionEventAndroid::GetPointerCount() const { 183 size_t MotionEventAndroid::GetPointerCount() const {
279 return cached_pointer_count_; 184 return cached_pointer_count_;
280 } 185 }
281 186
282 int MotionEventAndroid::GetPointerId(size_t pointer_index) const { 187 int MotionEventAndroid::GetPointerId(size_t pointer_index) const {
283 DCHECK_LT(pointer_index, cached_pointer_count_); 188 DCHECK_LT(pointer_index, cached_pointer_count_);
284 if (pointer_index < MAX_POINTERS_TO_CACHE) 189 if (pointer_index < MAX_POINTERS_TO_CACHE)
285 return cached_pointer_ids_[pointer_index]; 190 return cached_pointers_[pointer_index].id;
286 return Java_MotionEvent_getPointerId( 191 return Java_MotionEvent_getPointerId(
287 AttachCurrentThread(), event_.obj(), pointer_index); 192 AttachCurrentThread(), event_.obj(), pointer_index);
288 } 193 }
289 194
290 float MotionEventAndroid::GetX(size_t pointer_index) const { 195 float MotionEventAndroid::GetX(size_t pointer_index) const {
291 DCHECK_LT(pointer_index, cached_pointer_count_); 196 DCHECK_LT(pointer_index, cached_pointer_count_);
292 if (pointer_index < MAX_POINTERS_TO_CACHE) 197 if (pointer_index < MAX_POINTERS_TO_CACHE)
293 return cached_positions_[pointer_index].x(); 198 return cached_pointers_[pointer_index].position.x();
294 return ToDips(Java_MotionEvent_getXF_I( 199 return ToDips(Java_MotionEvent_getXF_I(
295 AttachCurrentThread(), event_.obj(), pointer_index)); 200 AttachCurrentThread(), event_.obj(), pointer_index));
296 } 201 }
297 202
298 float MotionEventAndroid::GetY(size_t pointer_index) const { 203 float MotionEventAndroid::GetY(size_t pointer_index) const {
299 DCHECK_LT(pointer_index, cached_pointer_count_); 204 DCHECK_LT(pointer_index, cached_pointer_count_);
300 if (pointer_index < MAX_POINTERS_TO_CACHE) 205 if (pointer_index < MAX_POINTERS_TO_CACHE)
301 return cached_positions_[pointer_index].y(); 206 return cached_pointers_[pointer_index].position.y();
302 return ToDips(Java_MotionEvent_getYF_I( 207 return ToDips(Java_MotionEvent_getYF_I(
303 AttachCurrentThread(), event_.obj(), pointer_index)); 208 AttachCurrentThread(), event_.obj(), pointer_index));
304 } 209 }
305 210
306 float MotionEventAndroid::GetRawX(size_t pointer_index) const { 211 float MotionEventAndroid::GetRawX(size_t pointer_index) const {
307 return GetX(pointer_index) + cached_raw_position_offset_.x(); 212 return GetX(pointer_index) + cached_raw_position_offset_.x();
308 } 213 }
309 214
310 float MotionEventAndroid::GetRawY(size_t pointer_index) const { 215 float MotionEventAndroid::GetRawY(size_t pointer_index) const {
311 return GetY(pointer_index) + cached_raw_position_offset_.y(); 216 return GetY(pointer_index) + cached_raw_position_offset_.y();
312 } 217 }
313 218
314 float MotionEventAndroid::GetTouchMajor(size_t pointer_index) const { 219 float MotionEventAndroid::GetTouchMajor(size_t pointer_index) const {
315 DCHECK_LT(pointer_index, cached_pointer_count_); 220 DCHECK_LT(pointer_index, cached_pointer_count_);
316 if (pointer_index < MAX_POINTERS_TO_CACHE) 221 if (pointer_index < MAX_POINTERS_TO_CACHE)
317 return cached_touch_majors_[pointer_index]; 222 return cached_pointers_[pointer_index].touch_major;
318 return ToDips(Java_MotionEvent_getTouchMajorF_I( 223 return ToDips(Java_MotionEvent_getTouchMajorF_I(
319 AttachCurrentThread(), event_.obj(), pointer_index)); 224 AttachCurrentThread(), event_.obj(), pointer_index));
320 } 225 }
321 226
322 float MotionEventAndroid::GetTouchMinor(size_t pointer_index) const { 227 float MotionEventAndroid::GetTouchMinor(size_t pointer_index) const {
323 DCHECK_LT(pointer_index, cached_pointer_count_); 228 DCHECK_LT(pointer_index, cached_pointer_count_);
324 if (pointer_index < MAX_POINTERS_TO_CACHE) 229 if (pointer_index < MAX_POINTERS_TO_CACHE)
325 return cached_touch_minors_[pointer_index]; 230 return cached_pointers_[pointer_index].touch_minor;
326 return ToDips(Java_MotionEvent_getTouchMinorF_I(AttachCurrentThread(), 231 return ToDips(Java_MotionEvent_getTouchMinorF_I(
327 event_.obj(), pointer_index)); 232 AttachCurrentThread(), event_.obj(), pointer_index));
328 } 233 }
329 234
330 float MotionEventAndroid::GetOrientation(size_t pointer_index) const { 235 float MotionEventAndroid::GetOrientation(size_t pointer_index) const {
331 DCHECK_LT(pointer_index, cached_pointer_count_); 236 DCHECK_LT(pointer_index, cached_pointer_count_);
332 if (pointer_index < MAX_POINTERS_TO_CACHE) 237 if (pointer_index < MAX_POINTERS_TO_CACHE)
333 return cached_orientations_[pointer_index]; 238 return cached_pointers_[pointer_index].orientation;
334 return ToValidFloat(Java_MotionEvent_getOrientationF_I( 239 return ToValidFloat(Java_MotionEvent_getOrientationF_I(
335 AttachCurrentThread(), event_.obj(), pointer_index)); 240 AttachCurrentThread(), event_.obj(), pointer_index));
336 } 241 }
337 242
338 float MotionEventAndroid::GetPressure(size_t pointer_index) const { 243 float MotionEventAndroid::GetPressure(size_t pointer_index) const {
339 DCHECK_LT(pointer_index, cached_pointer_count_); 244 DCHECK_LT(pointer_index, cached_pointer_count_);
245 // Note that this early return is a special case exercised only in testing, as
246 // caching the pressure values is not a worthwhile optimization (they're
247 // accessed at most once per event instance).
248 if (!event_.obj())
249 return 0.f;
340 return Java_MotionEvent_getPressureF_I( 250 return Java_MotionEvent_getPressureF_I(
341 AttachCurrentThread(), event_.obj(), pointer_index); 251 AttachCurrentThread(), event_.obj(), pointer_index);
342 } 252 }
343 253
344 base::TimeTicks MotionEventAndroid::GetEventTime() const { 254 base::TimeTicks MotionEventAndroid::GetEventTime() const {
345 return cached_time_; 255 return cached_time_;
346 } 256 }
347 257
348 size_t MotionEventAndroid::GetHistorySize() const { 258 size_t MotionEventAndroid::GetHistorySize() const {
349 return cached_history_size_; 259 return cached_history_size_;
(...skipping 21 matching lines...) Expand all
371 float MotionEventAndroid::GetHistoricalY(size_t pointer_index, 281 float MotionEventAndroid::GetHistoricalY(size_t pointer_index,
372 size_t historical_index) const { 282 size_t historical_index) const {
373 return ToDips(Java_MotionEvent_getHistoricalYF_I_I( 283 return ToDips(Java_MotionEvent_getHistoricalYF_I_I(
374 AttachCurrentThread(), event_.obj(), pointer_index, historical_index)); 284 AttachCurrentThread(), event_.obj(), pointer_index, historical_index));
375 } 285 }
376 286
377 ui::MotionEvent::ToolType MotionEventAndroid::GetToolType( 287 ui::MotionEvent::ToolType MotionEventAndroid::GetToolType(
378 size_t pointer_index) const { 288 size_t pointer_index) const {
379 DCHECK_LT(pointer_index, cached_pointer_count_); 289 DCHECK_LT(pointer_index, cached_pointer_count_);
380 if (pointer_index < MAX_POINTERS_TO_CACHE) 290 if (pointer_index < MAX_POINTERS_TO_CACHE)
381 return cached_tool_types_[pointer_index]; 291 return cached_pointers_[pointer_index].tool_type;
382 return FromAndroidToolType(Java_MotionEvent_getToolType( 292 return FromAndroidToolType(Java_MotionEvent_getToolType(
383 AttachCurrentThread(), event_.obj(), pointer_index)); 293 AttachCurrentThread(), event_.obj(), pointer_index));
384 } 294 }
385 295
386 int MotionEventAndroid::GetButtonState() const { 296 int MotionEventAndroid::GetButtonState() const {
387 return cached_button_state_; 297 return cached_button_state_;
388 } 298 }
389 299
390 int MotionEventAndroid::GetFlags() const { 300 int MotionEventAndroid::GetFlags() const {
391 return cached_flags_; 301 return cached_flags_;
392 } 302 }
393 303
394 scoped_ptr<ui::MotionEvent> MotionEventAndroid::Clone() const {
395 return scoped_ptr<MotionEvent>(new MotionEventAndroid(*this));
396 }
397
398 scoped_ptr<ui::MotionEvent> MotionEventAndroid::Cancel() const {
399 // The input coordinates to |MotionEventAndroid| are always in device pixels,
400 // but the cached coordinates are in DIPs.
401 const gfx::PointF position_pixels =
402 gfx::ScalePoint(cached_positions_[0], 1.f / pix_to_dip_);
403 return scoped_ptr<MotionEvent>(
404 new MotionEventAndroid(pix_to_dip_,
405 AttachCurrentThread(),
406 Obtain(GetDownTime(),
407 GetEventTime(),
408 MotionEventAndroid::ACTION_CANCEL,
409 position_pixels.x(),
410 position_pixels.y()).obj()));
411 }
412
413 base::TimeTicks MotionEventAndroid::GetDownTime() const {
414 return FromAndroidTime(
415 Java_MotionEvent_getDownTime(AttachCurrentThread(), event_.obj()));
416 }
417
418 float MotionEventAndroid::ToDips(float pixels) const { 304 float MotionEventAndroid::ToDips(float pixels) const {
419 return pixels * pix_to_dip_; 305 return pixels * pix_to_dip_;
420 } 306 }
421 307
422 gfx::PointF MotionEventAndroid::ToDips(const gfx::PointF& point_pixels) const { 308 MotionEventAndroid::CachedPointer MotionEventAndroid::FromAndroidPointer(
423 return gfx::ScalePoint(point_pixels, pix_to_dip_); 309 const Pointer& pointer) const {
310 CachedPointer result;
311 result.id = pointer.id;
312 result.position =
313 gfx::PointF(ToDips(pointer.pos_x_pixels), ToDips(pointer.pos_y_pixels));
314 result.touch_major = ToDips(pointer.touch_major_pixels);
315 result.touch_minor = ToDips(pointer.touch_minor_pixels);
316 result.orientation = ToValidFloat(pointer.orientation_rad);
317 result.tool_type = FromAndroidToolType(pointer.tool_type);
318 return result;
424 } 319 }
425 320
426 // static 321 // static
427 bool MotionEventAndroid::RegisterMotionEventAndroid(JNIEnv* env) { 322 bool MotionEventAndroid::RegisterMotionEventAndroid(JNIEnv* env) {
428 return JNI_MotionEvent::RegisterNativesImpl(env); 323 return JNI_MotionEvent::RegisterNativesImpl(env);
429 } 324 }
430 325
431 // static
432 base::android::ScopedJavaLocalRef<jobject> MotionEventAndroid::Obtain(
433 const MotionEventAndroid& event) {
434 return Java_MotionEvent_obtainAVME_AVME(AttachCurrentThread(),
435 event.event_.obj());
436 }
437
438 // static
439 base::android::ScopedJavaLocalRef<jobject> MotionEventAndroid::Obtain(
440 base::TimeTicks down_time,
441 base::TimeTicks event_time,
442 Action action,
443 float x_pixels,
444 float y_pixels) {
445 return Java_MotionEvent_obtainAVME_J_J_I_F_F_I(AttachCurrentThread(),
446 ToAndroidTime(down_time),
447 ToAndroidTime(event_time),
448 ToAndroidAction(action),
449 x_pixels,
450 y_pixels,
451 0);
452 }
453
454 } // namespace content 326 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698