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

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

Issue 321563002: Support minimum gesture bounds in GestureProvider (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Cleanup Created 6 years, 6 months 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 "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 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
55 } 55 }
56 56
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 float GetMinTouchMajorDipsForTool(int android_tool_type) {
66 switch (android_tool_type) {
67 case TOOL_TYPE_MOUSE:
68 case TOOL_TYPE_STYLUS:
69 return 0.f;
70 default:
71 // This value is somewhat arbitrarily chosen, but was used with success in
72 // the old gesture detection pipeline.
73 return 24.f;
74 };
75 }
76
65 } // namespace 77 } // namespace
66 78
67 MotionEventAndroid::MotionEventAndroid(float pix_to_dip, 79 MotionEventAndroid::MotionEventAndroid(float pix_to_dip,
68 JNIEnv* env, 80 JNIEnv* env,
69 jobject event, 81 jobject event,
70 jlong time_ms, 82 jlong time_ms,
71 jint android_action, 83 jint android_action,
72 jint pointer_count, 84 jint pointer_count,
73 jint history_size, 85 jint history_size,
74 jint action_index, 86 jint action_index,
75 jfloat pos_x_0_pixels, 87 jfloat pos_x_0_pixels,
76 jfloat pos_y_0_pixels, 88 jfloat pos_y_0_pixels,
77 jfloat pos_x_1_pixels, 89 jfloat pos_x_1_pixels,
78 jfloat pos_y_1_pixels, 90 jfloat pos_y_1_pixels,
79 jint pointer_id_0, 91 jint pointer_id_0,
80 jint pointer_id_1, 92 jint pointer_id_1,
81 jfloat touch_major_0_pixels, 93 jfloat touch_major_0_pixels,
82 jfloat touch_major_1_pixels) 94 jfloat touch_major_1_pixels,
95 jint tool_type)
83 : cached_time_(FromAndroidTime(time_ms)), 96 : cached_time_(FromAndroidTime(time_ms)),
84 cached_action_(FromAndroidAction(android_action)), 97 cached_action_(FromAndroidAction(android_action)),
85 cached_pointer_count_(pointer_count), 98 cached_pointer_count_(pointer_count),
86 cached_history_size_(history_size), 99 cached_history_size_(history_size),
87 cached_action_index_(action_index), 100 cached_action_index_(action_index),
88 pix_to_dip_(pix_to_dip), 101 pix_to_dip_(pix_to_dip),
102 min_touch_major_dips_(GetMinTouchMajorDipsForTool(tool_type)),
89 should_recycle_(false) { 103 should_recycle_(false) {
90 DCHECK_GT(pointer_count, 0); 104 DCHECK_GT(pointer_count, 0);
91 DCHECK_GE(history_size, 0); 105 DCHECK_GE(history_size, 0);
92 106
93 event_.Reset(env, event); 107 event_.Reset(env, event);
94 DCHECK(event_.obj()); 108 DCHECK(event_.obj());
95 109
96 cached_positions_[0] = ToDips(gfx::PointF(pos_x_0_pixels, pos_y_0_pixels)); 110 cached_positions_[0] = ToDips(gfx::PointF(pos_x_0_pixels, pos_y_0_pixels));
97 cached_positions_[1] = ToDips(gfx::PointF(pos_x_1_pixels, pos_y_1_pixels)); 111 cached_positions_[1] = ToDips(gfx::PointF(pos_x_1_pixels, pos_y_1_pixels));
98 cached_pointer_ids_[0] = pointer_id_0; 112 cached_pointer_ids_[0] = pointer_id_0;
99 cached_pointer_ids_[1] = pointer_id_1; 113 cached_pointer_ids_[1] = pointer_id_1;
100 cached_touch_majors_[0] = ToDips(touch_major_0_pixels); 114 cached_touch_majors_[0] = ToDips(touch_major_0_pixels);
101 cached_touch_majors_[1] = ToDips(touch_major_1_pixels); 115 cached_touch_majors_[1] = ToDips(touch_major_1_pixels);
102 } 116 }
103 117
104 MotionEventAndroid::MotionEventAndroid(float pix_to_dip, 118 MotionEventAndroid::MotionEventAndroid(float pix_to_dip,
119 float min_touch_major_dips_,
105 JNIEnv* env, 120 JNIEnv* env,
106 jobject event) 121 jobject event)
107 : cached_time_(FromAndroidTime(Java_MotionEvent_getEventTime(env, event))), 122 : cached_time_(FromAndroidTime(Java_MotionEvent_getEventTime(env, event))),
108 cached_action_( 123 cached_action_(
109 FromAndroidAction(Java_MotionEvent_getActionMasked(env, event))), 124 FromAndroidAction(Java_MotionEvent_getActionMasked(env, event))),
110 cached_pointer_count_(Java_MotionEvent_getPointerCount(env, event)), 125 cached_pointer_count_(Java_MotionEvent_getPointerCount(env, event)),
111 cached_history_size_(Java_MotionEvent_getHistorySize(env, event)), 126 cached_history_size_(Java_MotionEvent_getHistorySize(env, event)),
112 cached_action_index_(Java_MotionEvent_getActionIndex(env, event)), 127 cached_action_index_(Java_MotionEvent_getActionIndex(env, event)),
113 pix_to_dip_(pix_to_dip), 128 pix_to_dip_(pix_to_dip),
129 min_touch_major_dips_(min_touch_major_dips_),
114 should_recycle_(true) { 130 should_recycle_(true) {
115 event_.Reset(env, event); 131 event_.Reset(env, event);
116 DCHECK(event_.obj()); 132 DCHECK(event_.obj());
117 133
118 for (size_t i = 0; i < MAX_POINTERS_TO_CACHE; ++i) { 134 for (size_t i = 0; i < MAX_POINTERS_TO_CACHE; ++i) {
119 if (i < cached_pointer_count_) { 135 if (i < cached_pointer_count_) {
120 cached_positions_[i] = 136 cached_positions_[i] =
121 ToDips(gfx::PointF(Java_MotionEvent_getXF_I(env, event, i), 137 ToDips(gfx::PointF(Java_MotionEvent_getXF_I(env, event, i),
122 Java_MotionEvent_getYF_I(env, event, i))); 138 Java_MotionEvent_getYF_I(env, event, i)));
123 cached_pointer_ids_[i] = Java_MotionEvent_getPointerId(env, event, i); 139 cached_pointer_ids_[i] = Java_MotionEvent_getPointerId(env, event, i);
124 cached_touch_majors_[i] = 140 cached_touch_majors_[i] =
125 ToDips(Java_MotionEvent_getTouchMajorF_I(env, event, i)); 141 ToDips(Java_MotionEvent_getTouchMajorF_I(env, event, i));
126 } else { 142 } else {
127 cached_pointer_ids_[i] = 0; 143 cached_pointer_ids_[i] = 0;
128 cached_touch_majors_[i] = 0.f; 144 cached_touch_majors_[i] = 0.f;
129 } 145 }
130 } 146 }
131 } 147 }
132 148
133 MotionEventAndroid::MotionEventAndroid(const MotionEventAndroid& other) 149 MotionEventAndroid::MotionEventAndroid(const MotionEventAndroid& other)
134 : event_(Obtain(other)), 150 : event_(Obtain(other)),
135 cached_time_(other.cached_time_), 151 cached_time_(other.cached_time_),
136 cached_action_(other.cached_action_), 152 cached_action_(other.cached_action_),
137 cached_pointer_count_(other.cached_pointer_count_), 153 cached_pointer_count_(other.cached_pointer_count_),
138 cached_history_size_(other.cached_history_size_), 154 cached_history_size_(other.cached_history_size_),
139 cached_action_index_(other.cached_action_index_), 155 cached_action_index_(other.cached_action_index_),
140 pix_to_dip_(other.pix_to_dip_), 156 pix_to_dip_(other.pix_to_dip_),
157 min_touch_major_dips_(other.min_touch_major_dips_),
141 should_recycle_(true) { 158 should_recycle_(true) {
142 DCHECK(event_.obj()); 159 DCHECK(event_.obj());
143 for (size_t i = 0; i < MAX_POINTERS_TO_CACHE; ++i) { 160 for (size_t i = 0; i < MAX_POINTERS_TO_CACHE; ++i) {
144 cached_positions_[i] = other.cached_positions_[i]; 161 cached_positions_[i] = other.cached_positions_[i];
145 cached_pointer_ids_[i] = other.cached_pointer_ids_[i]; 162 cached_pointer_ids_[i] = other.cached_pointer_ids_[i];
146 cached_touch_majors_[i] = other.cached_touch_majors_[i]; 163 cached_touch_majors_[i] = other.cached_touch_majors_[i];
147 } 164 }
148 } 165 }
149 166
150 MotionEventAndroid::~MotionEventAndroid() { 167 MotionEventAndroid::~MotionEventAndroid() {
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
184 201
185 float MotionEventAndroid::GetY(size_t pointer_index) const { 202 float MotionEventAndroid::GetY(size_t pointer_index) const {
186 DCHECK_LT(pointer_index, cached_pointer_count_); 203 DCHECK_LT(pointer_index, cached_pointer_count_);
187 if (pointer_index < MAX_POINTERS_TO_CACHE) 204 if (pointer_index < MAX_POINTERS_TO_CACHE)
188 return cached_positions_[pointer_index].y(); 205 return cached_positions_[pointer_index].y();
189 return ToDips(Java_MotionEvent_getYF_I( 206 return ToDips(Java_MotionEvent_getYF_I(
190 AttachCurrentThread(), event_.obj(), pointer_index)); 207 AttachCurrentThread(), event_.obj(), pointer_index));
191 } 208 }
192 209
193 float MotionEventAndroid::GetTouchMajor(size_t pointer_index) const { 210 float MotionEventAndroid::GetTouchMajor(size_t pointer_index) const {
194 DCHECK_LT(pointer_index, cached_pointer_count_); 211 return std::max(min_touch_major_dips_, GetRawTouchMajor(pointer_index));
195 if (pointer_index < MAX_POINTERS_TO_CACHE)
196 return cached_touch_majors_[pointer_index];
197 return ToDips(Java_MotionEvent_getTouchMajorF_I(
198 AttachCurrentThread(), event_.obj(), pointer_index));
199 } 212 }
200 213
201 float MotionEventAndroid::GetPressure(size_t pointer_index) const { 214 float MotionEventAndroid::GetPressure(size_t pointer_index) const {
202 DCHECK_LT(pointer_index, cached_pointer_count_); 215 DCHECK_LT(pointer_index, cached_pointer_count_);
203 return Java_MotionEvent_getPressureF_I( 216 return Java_MotionEvent_getPressureF_I(
204 AttachCurrentThread(), event_.obj(), pointer_index); 217 AttachCurrentThread(), event_.obj(), pointer_index);
205 } 218 }
206 219
207 base::TimeTicks MotionEventAndroid::GetEventTime() const { 220 base::TimeTicks MotionEventAndroid::GetEventTime() const {
208 return cached_time_; 221 return cached_time_;
209 } 222 }
210 223
211 size_t MotionEventAndroid::GetHistorySize() const { 224 size_t MotionEventAndroid::GetHistorySize() const {
212 return cached_history_size_; 225 return cached_history_size_;
213 } 226 }
214 227
215 base::TimeTicks MotionEventAndroid::GetHistoricalEventTime( 228 base::TimeTicks MotionEventAndroid::GetHistoricalEventTime(
216 size_t historical_index) const { 229 size_t historical_index) const {
217 return FromAndroidTime(Java_MotionEvent_getHistoricalEventTime( 230 return FromAndroidTime(Java_MotionEvent_getHistoricalEventTime(
218 AttachCurrentThread(), event_.obj(), historical_index)); 231 AttachCurrentThread(), event_.obj(), historical_index));
219 } 232 }
220 233
221 float MotionEventAndroid::GetHistoricalTouchMajor( 234 float MotionEventAndroid::GetHistoricalTouchMajor(
222 size_t pointer_index, 235 size_t pointer_index,
223 size_t historical_index) const { 236 size_t historical_index) const {
224 return ToDips(Java_MotionEvent_getHistoricalTouchMajorF_I_I( 237 return std::max(min_touch_major_dips_,
225 AttachCurrentThread(), event_.obj(), pointer_index, historical_index)); 238 ToDips(Java_MotionEvent_getHistoricalTouchMajorF_I_I(
239 AttachCurrentThread(),
240 event_.obj(),
241 pointer_index,
242 historical_index)));
226 } 243 }
227 244
228 float MotionEventAndroid::GetHistoricalX(size_t pointer_index, 245 float MotionEventAndroid::GetHistoricalX(size_t pointer_index,
229 size_t historical_index) const { 246 size_t historical_index) const {
230 return ToDips(Java_MotionEvent_getHistoricalXF_I_I( 247 return ToDips(Java_MotionEvent_getHistoricalXF_I_I(
231 AttachCurrentThread(), event_.obj(), pointer_index, historical_index)); 248 AttachCurrentThread(), event_.obj(), pointer_index, historical_index));
232 } 249 }
233 250
234 float MotionEventAndroid::GetHistoricalY(size_t pointer_index, 251 float MotionEventAndroid::GetHistoricalY(size_t pointer_index,
235 size_t historical_index) const { 252 size_t historical_index) const {
236 return ToDips(Java_MotionEvent_getHistoricalYF_I_I( 253 return ToDips(Java_MotionEvent_getHistoricalYF_I_I(
237 AttachCurrentThread(), event_.obj(), pointer_index, historical_index)); 254 AttachCurrentThread(), event_.obj(), pointer_index, historical_index));
238 } 255 }
239 256
240 scoped_ptr<ui::MotionEvent> MotionEventAndroid::Clone() const { 257 scoped_ptr<ui::MotionEvent> MotionEventAndroid::Clone() const {
241 return scoped_ptr<MotionEvent>(new MotionEventAndroid(*this)); 258 return scoped_ptr<MotionEvent>(new MotionEventAndroid(*this));
242 } 259 }
243 260
244 scoped_ptr<ui::MotionEvent> MotionEventAndroid::Cancel() const { 261 scoped_ptr<ui::MotionEvent> MotionEventAndroid::Cancel() const {
245 // The input coordinates to |MotionEventAndroid| are always in device pixels, 262 // The input coordinates to |MotionEventAndroid| are always in device pixels,
246 // but the cached coordinates are in DIPs. 263 // but the cached coordinates are in DIPs.
247 const gfx::PointF position_pixels = 264 const gfx::PointF position_pixels =
248 gfx::ScalePoint(cached_positions_[0], 1.f / pix_to_dip_); 265 gfx::ScalePoint(cached_positions_[0], 1.f / pix_to_dip_);
249 return scoped_ptr<MotionEvent>( 266 return scoped_ptr<MotionEvent>(
250 new MotionEventAndroid(pix_to_dip_, 267 new MotionEventAndroid(pix_to_dip_,
268 min_touch_major_dips_,
251 AttachCurrentThread(), 269 AttachCurrentThread(),
252 Obtain(GetDownTime(), 270 Obtain(GetDownTime(),
253 GetEventTime(), 271 GetEventTime(),
254 MotionEventAndroid::ACTION_CANCEL, 272 MotionEventAndroid::ACTION_CANCEL,
255 position_pixels.x(), 273 position_pixels.x(),
256 position_pixels.y()).obj())); 274 position_pixels.y()).obj()));
257 } 275 }
258 276
259 float MotionEventAndroid::GetTouchMinor(size_t pointer_index) const { 277 float MotionEventAndroid::GetRawTouchMajor(size_t pointer_index) const {
278 DCHECK_LT(pointer_index, cached_pointer_count_);
279 if (pointer_index < MAX_POINTERS_TO_CACHE)
280 return cached_touch_majors_[pointer_index];
281 return ToDips(Java_MotionEvent_getTouchMajorF_I(
282 AttachCurrentThread(), event_.obj(), pointer_index));
283 }
284
285 float MotionEventAndroid::GetRawTouchMinor(size_t pointer_index) const {
260 return ToDips(Java_MotionEvent_getTouchMinorF_I( 286 return ToDips(Java_MotionEvent_getTouchMinorF_I(
261 AttachCurrentThread(), event_.obj(), pointer_index)); 287 AttachCurrentThread(), event_.obj(), pointer_index));
262 } 288 }
263 289
264 float MotionEventAndroid::GetOrientation() const { 290 float MotionEventAndroid::GetOrientation() const {
265 return Java_MotionEvent_getOrientationF(AttachCurrentThread(), event_.obj()); 291 return Java_MotionEvent_getOrientationF(AttachCurrentThread(), event_.obj());
266 } 292 }
267 293
268 base::TimeTicks MotionEventAndroid::GetDownTime() const { 294 base::TimeTicks MotionEventAndroid::GetDownTime() const {
269 return FromAndroidTime( 295 return FromAndroidTime(
(...skipping 30 matching lines...) Expand all
300 return Java_MotionEvent_obtainAVME_J_J_I_F_F_I(AttachCurrentThread(), 326 return Java_MotionEvent_obtainAVME_J_J_I_F_F_I(AttachCurrentThread(),
301 ToAndroidTime(down_time), 327 ToAndroidTime(down_time),
302 ToAndroidTime(event_time), 328 ToAndroidTime(event_time),
303 ToAndroidAction(action), 329 ToAndroidAction(action),
304 x_pixels, 330 x_pixels,
305 y_pixels, 331 y_pixels,
306 0); 332 0);
307 } 333 }
308 334
309 } // namespace content 335 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698