15d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
25d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// found in the LICENSE file.
45d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
55d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/browser/renderer_host/input/motion_event_android.h"
65d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
71320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include <android/input.h>
81320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
95d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/android/jni_android.h"
101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/float_util.h"
115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "jni/MotionEvent_jni.h"
121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "ui/events/event_constants.h"
135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)using base::android::AttachCurrentThread;
155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)using namespace JNI_MotionEvent;
165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace content {
185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace {
195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
20a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)int ToAndroidAction(MotionEventAndroid::Action action) {
21a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  switch (action) {
225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    case MotionEventAndroid::ACTION_DOWN:
23a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      return ACTION_DOWN;
245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    case MotionEventAndroid::ACTION_UP:
25a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      return ACTION_UP;
265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    case MotionEventAndroid::ACTION_MOVE:
27a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      return ACTION_MOVE;
285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    case MotionEventAndroid::ACTION_CANCEL:
29a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      return ACTION_CANCEL;
305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    case MotionEventAndroid::ACTION_POINTER_DOWN:
31a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      return ACTION_POINTER_DOWN;
325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    case MotionEventAndroid::ACTION_POINTER_UP:
33a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      return ACTION_POINTER_UP;
34a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  };
35a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  NOTREACHED() << "Invalid Android MotionEvent type for gesture detection: "
36a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)               << action;
37a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return ACTION_CANCEL;
38a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
39a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
40a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)MotionEventAndroid::Action FromAndroidAction(int android_action) {
41a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  switch (android_action) {
42a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    case ACTION_DOWN:
43a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      return MotionEventAndroid::ACTION_DOWN;
44a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    case ACTION_UP:
45a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      return MotionEventAndroid::ACTION_UP;
46a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    case ACTION_MOVE:
47a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      return MotionEventAndroid::ACTION_MOVE;
48a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    case ACTION_CANCEL:
49a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      return MotionEventAndroid::ACTION_CANCEL;
50a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    case ACTION_POINTER_DOWN:
51a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      return MotionEventAndroid::ACTION_POINTER_DOWN;
52a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    case ACTION_POINTER_UP:
53a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      return MotionEventAndroid::ACTION_POINTER_UP;
545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    default:
555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      NOTREACHED() << "Invalid Android MotionEvent type for gesture detection: "
565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                   << android_action;
575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  };
585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return MotionEventAndroid::ACTION_CANCEL;
595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
61116680a4aac90f2aa7413d9095a592090648e557Ben MurdochMotionEventAndroid::ToolType FromAndroidToolType(int android_tool_type) {
62116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  switch (android_tool_type) {
63116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    case TOOL_TYPE_UNKNOWN:
64116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      return MotionEventAndroid::TOOL_TYPE_UNKNOWN;
65116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    case TOOL_TYPE_FINGER:
66116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      return MotionEventAndroid::TOOL_TYPE_FINGER;
67116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    case TOOL_TYPE_STYLUS:
68116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      return MotionEventAndroid::TOOL_TYPE_STYLUS;
69116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    case TOOL_TYPE_MOUSE:
70116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      return MotionEventAndroid::TOOL_TYPE_MOUSE;
716e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    case TOOL_TYPE_ERASER:
726e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      return MotionEventAndroid::TOOL_TYPE_ERASER;
73116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    default:
74116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      NOTREACHED() << "Invalid Android MotionEvent tool type: "
75116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                   << android_tool_type;
76116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  };
77116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return MotionEventAndroid::TOOL_TYPE_UNKNOWN;
78116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
79116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
80116680a4aac90f2aa7413d9095a592090648e557Ben Murdochint FromAndroidButtonState(int button_state) {
81116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  int result = 0;
82116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if ((button_state & BUTTON_BACK) != 0)
83116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    result |= MotionEventAndroid::BUTTON_BACK;
84116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if ((button_state & BUTTON_FORWARD) != 0)
85116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    result |= MotionEventAndroid::BUTTON_FORWARD;
86116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if ((button_state & BUTTON_PRIMARY) != 0)
87116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    result |= MotionEventAndroid::BUTTON_PRIMARY;
88116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if ((button_state & BUTTON_SECONDARY) != 0)
89116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    result |= MotionEventAndroid::BUTTON_SECONDARY;
90116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if ((button_state & BUTTON_TERTIARY) != 0)
91116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    result |= MotionEventAndroid::BUTTON_TERTIARY;
92116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return result;
93116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
94116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciint FromAndroidMetaState(int meta_state) {
961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  int flags = ui::EF_NONE;
971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if ((meta_state & AMETA_SHIFT_ON) != 0)
981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    flags |= ui::EF_SHIFT_DOWN;
991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if ((meta_state & AMETA_CTRL_ON) != 0)
1001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    flags |= ui::EF_CONTROL_DOWN;
1011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if ((meta_state & AMETA_ALT_ON) != 0)
1021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    flags |= ui::EF_ALT_DOWN;
1031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if ((meta_state & AMETA_META_ON) != 0)
1041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    flags |= ui::EF_COMMAND_DOWN;
1051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if ((meta_state & AMETA_CAPS_LOCK_ON) != 0)
1061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    flags |= ui::EF_CAPS_LOCK_DOWN;
1071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return flags;
1081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
1091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)int64 ToAndroidTime(base::TimeTicks time) {
1115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return (time - base::TimeTicks()).InMilliseconds();
1125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
1135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::TimeTicks FromAndroidTime(int64 time_ms) {
1155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return base::TimeTicks() + base::TimeDelta::FromMilliseconds(time_ms);
1165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
1175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccifloat ToValidFloat(float x) {
1191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return base::IsNaN(x) ? 0.f : x;
1201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
1211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}  // namespace
1235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
124a02191e04bc25c4935f804f2c080ae28663d096dBen MurdochMotionEventAndroid::MotionEventAndroid(float pix_to_dip,
125a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                                       JNIEnv* env,
126a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                       jobject event,
127a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                       jlong time_ms,
128a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                       jint android_action,
129a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                       jint pointer_count,
130a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                       jint history_size,
131a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                       jint action_index,
132a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                                       jfloat pos_x_0_pixels,
133a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                                       jfloat pos_y_0_pixels,
134a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                                       jfloat pos_x_1_pixels,
135a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                                       jfloat pos_y_1_pixels,
136a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                       jint pointer_id_0,
137a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                       jint pointer_id_1,
138a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                                       jfloat touch_major_0_pixels,
139f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                       jfloat touch_major_1_pixels,
1401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                       jfloat touch_minor_0_pixels,
1411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                       jfloat touch_minor_1_pixels,
1421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                       jfloat orientation_0_rad,
1431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                       jfloat orientation_1_rad,
144f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                       jfloat raw_pos_x_pixels,
145116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                       jfloat raw_pos_y_pixels,
146116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                       jint android_tool_type_0,
147116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                       jint android_tool_type_1,
1481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                       jint android_button_state,
1491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                       jint meta_state)
150a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    : cached_time_(FromAndroidTime(time_ms)),
151a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      cached_action_(FromAndroidAction(android_action)),
152a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      cached_pointer_count_(pointer_count),
153a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      cached_history_size_(history_size),
154a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      cached_action_index_(action_index),
155116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      cached_button_state_(FromAndroidButtonState(android_button_state)),
1561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      cached_flags_(FromAndroidMetaState(meta_state)),
157a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      pix_to_dip_(pix_to_dip),
158a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      should_recycle_(false) {
159a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  DCHECK_GT(pointer_count, 0);
160a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  DCHECK_GE(history_size, 0);
161a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
162a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  event_.Reset(env, event);
1635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  DCHECK(event_.obj());
164a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
165a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  cached_positions_[0] = ToDips(gfx::PointF(pos_x_0_pixels, pos_y_0_pixels));
166a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  cached_positions_[1] = ToDips(gfx::PointF(pos_x_1_pixels, pos_y_1_pixels));
167a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  cached_pointer_ids_[0] = pointer_id_0;
168a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  cached_pointer_ids_[1] = pointer_id_1;
169a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  cached_touch_majors_[0] = ToDips(touch_major_0_pixels);
170a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  cached_touch_majors_[1] = ToDips(touch_major_1_pixels);
1711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  cached_touch_minors_[0] = ToDips(touch_minor_0_pixels);
1721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  cached_touch_minors_[1] = ToDips(touch_minor_1_pixels);
1731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  cached_orientations_[0] = ToValidFloat(orientation_0_rad);
1741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  cached_orientations_[1] = ToValidFloat(orientation_1_rad);
175f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  cached_raw_position_offset_ =
176f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      ToDips(gfx::PointF(raw_pos_x_pixels, raw_pos_y_pixels)) -
177f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      cached_positions_[0];
178116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  cached_tool_types_[0] = FromAndroidToolType(android_tool_type_0);
179116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  cached_tool_types_[1] = FromAndroidToolType(android_tool_type_1);
180a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
181a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
182a02191e04bc25c4935f804f2c080ae28663d096dBen MurdochMotionEventAndroid::MotionEventAndroid(float pix_to_dip,
183a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                                       JNIEnv* env,
184a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                                       jobject event)
185a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    : cached_time_(FromAndroidTime(Java_MotionEvent_getEventTime(env, event))),
186a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      cached_action_(
187a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch          FromAndroidAction(Java_MotionEvent_getActionMasked(env, event))),
188a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      cached_pointer_count_(Java_MotionEvent_getPointerCount(env, event)),
189a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      cached_history_size_(Java_MotionEvent_getHistorySize(env, event)),
190a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      cached_action_index_(Java_MotionEvent_getActionIndex(env, event)),
191116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      cached_button_state_(
192116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch          FromAndroidButtonState(Java_MotionEvent_getButtonState(env, event))),
1931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      cached_flags_(
1941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          FromAndroidMetaState(Java_MotionEvent_getMetaState(env, event))),
195a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      pix_to_dip_(pix_to_dip),
196a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      should_recycle_(true) {
197a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  event_.Reset(env, event);
198a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  DCHECK(event_.obj());
199a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
200a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  for (size_t i = 0; i < MAX_POINTERS_TO_CACHE; ++i) {
201a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    if (i < cached_pointer_count_) {
202a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      cached_positions_[i] =
203a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch          ToDips(gfx::PointF(Java_MotionEvent_getXF_I(env, event, i),
204a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                             Java_MotionEvent_getYF_I(env, event, i)));
205a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      cached_pointer_ids_[i] = Java_MotionEvent_getPointerId(env, event, i);
206a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      cached_touch_majors_[i] =
207a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch          ToDips(Java_MotionEvent_getTouchMajorF_I(env, event, i));
2081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      cached_touch_minors_[i] =
2091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          ToDips(Java_MotionEvent_getTouchMinorF_I(env, event, i));
2101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      cached_orientations_[i] =
2111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          ToValidFloat(Java_MotionEvent_getOrientationF_I(env, event, i));
212116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      cached_tool_types_[i] =
213116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch          FromAndroidToolType(Java_MotionEvent_getToolType(env, event, i));
214a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    } else {
215a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      cached_pointer_ids_[i] = 0;
216a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      cached_touch_majors_[i] = 0.f;
2171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      cached_touch_minors_[i] = 0.f;
2181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      cached_orientations_[i] = 0.f;
219116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      cached_tool_types_[i] = MotionEvent::TOOL_TYPE_UNKNOWN;
220a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    }
221a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
222f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
223f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  cached_raw_position_offset_ =
224f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      ToDips(gfx::PointF(Java_MotionEvent_getRawX(env, event),
225f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                         Java_MotionEvent_getRawY(env, event))) -
226f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      cached_positions_[0];
2275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
2285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
229a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)MotionEventAndroid::MotionEventAndroid(const MotionEventAndroid& other)
230a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    : event_(Obtain(other)),
231a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      cached_time_(other.cached_time_),
232a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      cached_action_(other.cached_action_),
233a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      cached_pointer_count_(other.cached_pointer_count_),
234a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      cached_history_size_(other.cached_history_size_),
235a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      cached_action_index_(other.cached_action_index_),
236f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      cached_raw_position_offset_(other.cached_raw_position_offset_),
237116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      cached_button_state_(other.cached_button_state_),
2381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      cached_flags_(other.cached_flags_),
239a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      pix_to_dip_(other.pix_to_dip_),
240a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      should_recycle_(true) {
2415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  DCHECK(event_.obj());
242a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  for (size_t i = 0; i < MAX_POINTERS_TO_CACHE; ++i) {
243a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    cached_positions_[i] = other.cached_positions_[i];
244a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    cached_pointer_ids_[i] = other.cached_pointer_ids_[i];
245a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    cached_touch_majors_[i] = other.cached_touch_majors_[i];
2461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    cached_touch_minors_[i] = other.cached_touch_minors_[i];
2471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    cached_orientations_[i] = other.cached_orientations_[i];
248116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    cached_tool_types_[i] = other.cached_tool_types_[i];
249a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
2505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
2515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)MotionEventAndroid::~MotionEventAndroid() {
2535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (should_recycle_)
2545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    Java_MotionEvent_recycle(AttachCurrentThread(), event_.obj());
2555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
2565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
257c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochint MotionEventAndroid::GetId() const {
258c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  return 0;
259c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
260c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
261a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)MotionEventAndroid::Action MotionEventAndroid::GetAction() const {
262a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return cached_action_;
2635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
2645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
265f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)int MotionEventAndroid::GetActionIndex() const {
266f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  return cached_action_index_;
267f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
2685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)size_t MotionEventAndroid::GetPointerCount() const {
270a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return cached_pointer_count_;
2715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
2725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)int MotionEventAndroid::GetPointerId(size_t pointer_index) const {
274a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  DCHECK_LT(pointer_index, cached_pointer_count_);
275a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (pointer_index < MAX_POINTERS_TO_CACHE)
276a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    return cached_pointer_ids_[pointer_index];
2775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return Java_MotionEvent_getPointerId(
2785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      AttachCurrentThread(), event_.obj(), pointer_index);
2795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
2805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)float MotionEventAndroid::GetX(size_t pointer_index) const {
282a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  DCHECK_LT(pointer_index, cached_pointer_count_);
283a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (pointer_index < MAX_POINTERS_TO_CACHE)
284a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    return cached_positions_[pointer_index].x();
285a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  return ToDips(Java_MotionEvent_getXF_I(
286a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      AttachCurrentThread(), event_.obj(), pointer_index));
2875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
2885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)float MotionEventAndroid::GetY(size_t pointer_index) const {
290a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  DCHECK_LT(pointer_index, cached_pointer_count_);
291a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (pointer_index < MAX_POINTERS_TO_CACHE)
292a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    return cached_positions_[pointer_index].y();
293a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  return ToDips(Java_MotionEvent_getYF_I(
294a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      AttachCurrentThread(), event_.obj(), pointer_index));
2955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
2965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
297f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)float MotionEventAndroid::GetRawX(size_t pointer_index) const {
298f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  return GetX(pointer_index) + cached_raw_position_offset_.x();
299f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
300f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
301f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)float MotionEventAndroid::GetRawY(size_t pointer_index) const {
302f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  return GetY(pointer_index) + cached_raw_position_offset_.y();
303f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
304f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
3055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)float MotionEventAndroid::GetTouchMajor(size_t pointer_index) const {
306a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  DCHECK_LT(pointer_index, cached_pointer_count_);
307a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (pointer_index < MAX_POINTERS_TO_CACHE)
308a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    return cached_touch_majors_[pointer_index];
309a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  return ToDips(Java_MotionEvent_getTouchMajorF_I(
310a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      AttachCurrentThread(), event_.obj(), pointer_index));
3115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
3125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccifloat MotionEventAndroid::GetTouchMinor(size_t pointer_index) const {
3141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DCHECK_LT(pointer_index, cached_pointer_count_);
3151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (pointer_index < MAX_POINTERS_TO_CACHE)
3161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return cached_touch_minors_[pointer_index];
3171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return ToDips(Java_MotionEvent_getTouchMinorF_I(AttachCurrentThread(),
3181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    event_.obj(), pointer_index));
3191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
3201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccifloat MotionEventAndroid::GetOrientation(size_t pointer_index) const {
3221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DCHECK_LT(pointer_index, cached_pointer_count_);
3231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (pointer_index < MAX_POINTERS_TO_CACHE)
3241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return cached_orientations_[pointer_index];
3251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return ToValidFloat(Java_MotionEvent_getOrientationF_I(
3261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      AttachCurrentThread(), event_.obj(), pointer_index));
3271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
3281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
329a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)float MotionEventAndroid::GetPressure(size_t pointer_index) const {
330a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  DCHECK_LT(pointer_index, cached_pointer_count_);
331a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return Java_MotionEvent_getPressureF_I(
3325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      AttachCurrentThread(), event_.obj(), pointer_index);
3335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
3345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::TimeTicks MotionEventAndroid::GetEventTime() const {
336a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return cached_time_;
3375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
3385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)size_t MotionEventAndroid::GetHistorySize() const {
340a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return cached_history_size_;
3415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
3425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::TimeTicks MotionEventAndroid::GetHistoricalEventTime(
3445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    size_t historical_index) const {
3455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return FromAndroidTime(Java_MotionEvent_getHistoricalEventTime(
3465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      AttachCurrentThread(), event_.obj(), historical_index));
3475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
3485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
349a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochfloat MotionEventAndroid::GetHistoricalTouchMajor(
350a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    size_t pointer_index,
351a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    size_t historical_index) const {
352a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  return ToDips(Java_MotionEvent_getHistoricalTouchMajorF_I_I(
353a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      AttachCurrentThread(), event_.obj(), pointer_index, historical_index));
3545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
3555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)float MotionEventAndroid::GetHistoricalX(size_t pointer_index,
3575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                         size_t historical_index) const {
358a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  return ToDips(Java_MotionEvent_getHistoricalXF_I_I(
359a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      AttachCurrentThread(), event_.obj(), pointer_index, historical_index));
3605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
3615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)float MotionEventAndroid::GetHistoricalY(size_t pointer_index,
3635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                         size_t historical_index) const {
364a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  return ToDips(Java_MotionEvent_getHistoricalYF_I_I(
365a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      AttachCurrentThread(), event_.obj(), pointer_index, historical_index));
3665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
3675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
368116680a4aac90f2aa7413d9095a592090648e557Ben Murdochui::MotionEvent::ToolType MotionEventAndroid::GetToolType(
369116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    size_t pointer_index) const {
370116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  DCHECK_LT(pointer_index, cached_pointer_count_);
371116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (pointer_index < MAX_POINTERS_TO_CACHE)
372116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return cached_tool_types_[pointer_index];
373116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return FromAndroidToolType(Java_MotionEvent_getToolType(
374116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      AttachCurrentThread(), event_.obj(), pointer_index));
375116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
376116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
377116680a4aac90f2aa7413d9095a592090648e557Ben Murdochint MotionEventAndroid::GetButtonState() const {
378116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return cached_button_state_;
379116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
380116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
3811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciint MotionEventAndroid::GetFlags() const {
3821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return cached_flags_;
3831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
3841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
385a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)scoped_ptr<ui::MotionEvent> MotionEventAndroid::Clone() const {
386a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return scoped_ptr<MotionEvent>(new MotionEventAndroid(*this));
387a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
388a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
389a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)scoped_ptr<ui::MotionEvent> MotionEventAndroid::Cancel() const {
390a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // The input coordinates to |MotionEventAndroid| are always in device pixels,
391a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // but the cached coordinates are in DIPs.
392a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  const gfx::PointF position_pixels =
393a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      gfx::ScalePoint(cached_positions_[0], 1.f / pix_to_dip_);
394a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  return scoped_ptr<MotionEvent>(
395a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      new MotionEventAndroid(pix_to_dip_,
396a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                             AttachCurrentThread(),
397a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                             Obtain(GetDownTime(),
398a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                                    GetEventTime(),
399a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                                    MotionEventAndroid::ACTION_CANCEL,
400a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                                    position_pixels.x(),
401a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                                    position_pixels.y()).obj()));
402a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
403a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
404a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)base::TimeTicks MotionEventAndroid::GetDownTime() const {
405a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return FromAndroidTime(
406a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      Java_MotionEvent_getDownTime(AttachCurrentThread(), event_.obj()));
407a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
408a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
409a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochfloat MotionEventAndroid::ToDips(float pixels) const {
410a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  return pixels * pix_to_dip_;
411a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch}
412a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
413a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochgfx::PointF MotionEventAndroid::ToDips(const gfx::PointF& point_pixels) const {
414a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  return gfx::ScalePoint(point_pixels, pix_to_dip_);
415a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch}
416a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
4175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// static
4185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool MotionEventAndroid::RegisterMotionEventAndroid(JNIEnv* env) {
4195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return JNI_MotionEvent::RegisterNativesImpl(env);
4205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
4215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// static
423a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)base::android::ScopedJavaLocalRef<jobject> MotionEventAndroid::Obtain(
4245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const MotionEventAndroid& event) {
425a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return Java_MotionEvent_obtainAVME_AVME(AttachCurrentThread(),
426a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                          event.event_.obj());
4275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
4285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// static
430a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)base::android::ScopedJavaLocalRef<jobject> MotionEventAndroid::Obtain(
4315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    base::TimeTicks down_time,
432a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    base::TimeTicks event_time,
4335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    Action action,
434a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    float x_pixels,
435a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    float y_pixels) {
436a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return Java_MotionEvent_obtainAVME_J_J_I_F_F_I(AttachCurrentThread(),
437a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                                 ToAndroidTime(down_time),
438a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                                 ToAndroidTime(event_time),
439a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                                 ToAndroidAction(action),
440a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                                                 x_pixels,
441a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                                                 y_pixels,
442a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                                 0);
4435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
4445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}  // namespace content
446