Index: ui/events/gesture_detection/gesture_touch_uma_histogram.cc |
diff --git a/ui/events/gesture_detection/gesture_touch_uma_histogram.cc b/ui/events/gesture_detection/gesture_touch_uma_histogram.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..51d37313f21f35afa194188d09bd856419973fbd |
--- /dev/null |
+++ b/ui/events/gesture_detection/gesture_touch_uma_histogram.cc |
@@ -0,0 +1,144 @@ |
+// Copyright 2014 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "ui/events/gesture_detection/gesture_touch_uma_histogram.h" |
+ |
+#include "base/metrics/histogram.h" |
+ |
+namespace ui { |
+ |
+GestureTouchUMAHistogram::GestureTouchUMAHistogram() |
+ : max_distance_from_start_squared_(0), is_single_finger_(true) { |
+} |
+ |
+GestureTouchUMAHistogram::~GestureTouchUMAHistogram() { |
+} |
+ |
+void GestureTouchUMAHistogram::RecordGestureEvent( |
+ const GestureEventData& gesture) { |
+ UMA_HISTOGRAM_ENUMERATION( |
+ "Event.GestureCreated", UMAEventTypeFromEvent(gesture), UMA_ET_COUNT); |
+} |
+ |
+void GestureTouchUMAHistogram::RecordTouchEvent(const MotionEvent& event) { |
+ if (event.GetAction() == MotionEvent::ACTION_DOWN) { |
+ start_time_ = event.GetEventTime(); |
+ start_touch_position_ = gfx::Point(event.GetX(), event.GetY()); |
+ is_single_finger_ = true; |
+ max_distance_from_start_squared_ = 0; |
+ } else if (event.GetAction() == MotionEvent::ACTION_MOVE && |
+ is_single_finger_) { |
+ float cur_dist = (start_touch_position_ - |
+ gfx::Point(event.GetX(), event.GetY())).LengthSquared(); |
+ if (cur_dist > max_distance_from_start_squared_) |
+ max_distance_from_start_squared_ = cur_dist; |
+ } else { |
+ if (event.GetAction() == MotionEvent::ACTION_UP && is_single_finger_) { |
+ UMA_HISTOGRAM_CUSTOM_COUNTS( |
+ "Event.TouchMaxDistance", |
+ static_cast<int>(sqrt(max_distance_from_start_squared_)), |
+ 0, |
+ 1500, |
+ 50); |
+ |
+ base::TimeDelta duration = event.GetEventTime() - start_time_; |
+ UMA_HISTOGRAM_TIMES("Event.TouchDuration2", duration); |
+ } |
+ is_single_finger_ = false; |
+ } |
+} |
+ |
+UMAEventType GestureTouchUMAHistogram::UMAEventTypeFromEvent( |
+ const GestureEventData& gesture) { |
+ switch (gesture.type()) { |
+ case ET_TOUCH_RELEASED: |
+ return UMA_ET_TOUCH_RELEASED; |
+ case ET_TOUCH_PRESSED: |
+ return UMA_ET_TOUCH_PRESSED; |
+ case ET_TOUCH_MOVED: |
+ return UMA_ET_TOUCH_MOVED; |
+ case ET_TOUCH_CANCELLED: |
+ return UMA_ET_TOUCH_CANCELLED; |
+ case ET_GESTURE_SCROLL_BEGIN: |
+ return UMA_ET_GESTURE_SCROLL_BEGIN; |
+ case ET_GESTURE_SCROLL_END: |
+ return UMA_ET_GESTURE_SCROLL_END; |
+ case ET_GESTURE_SCROLL_UPDATE: { |
+ int touch_points = gesture.details.touch_points(); |
+ if (touch_points == 1) |
+ return UMA_ET_GESTURE_SCROLL_UPDATE; |
+ else if (touch_points == 2) |
+ return UMA_ET_GESTURE_SCROLL_UPDATE_2; |
+ else if (touch_points == 3) |
+ return UMA_ET_GESTURE_SCROLL_UPDATE_3; |
+ return UMA_ET_GESTURE_SCROLL_UPDATE_4P; |
+ } |
+ case ET_GESTURE_TAP: { |
+ int tap_count = gesture.details.tap_count(); |
+ if (tap_count == 1) |
+ return UMA_ET_GESTURE_TAP; |
+ if (tap_count == 2) |
+ return UMA_ET_GESTURE_DOUBLE_TAP; |
+ if (tap_count == 3) |
+ return UMA_ET_GESTURE_TRIPLE_TAP; |
+ NOTREACHED() << "Received tap with tapcount " << tap_count; |
+ return UMA_ET_UNKNOWN; |
+ } |
+ case ET_GESTURE_TAP_DOWN: |
+ return UMA_ET_GESTURE_TAP_DOWN; |
+ case ET_GESTURE_BEGIN: |
+ return UMA_ET_GESTURE_BEGIN; |
+ case ET_GESTURE_END: |
+ return UMA_ET_GESTURE_END; |
+ case ET_GESTURE_TWO_FINGER_TAP: |
+ return UMA_ET_GESTURE_TWO_FINGER_TAP; |
+ case ET_GESTURE_PINCH_BEGIN: |
+ return UMA_ET_GESTURE_PINCH_BEGIN; |
+ case ET_GESTURE_PINCH_END: |
+ return UMA_ET_GESTURE_PINCH_END; |
+ case ET_GESTURE_PINCH_UPDATE: { |
+ int touch_points = gesture.details.touch_points(); |
+ if (touch_points >= 4) |
+ return UMA_ET_GESTURE_PINCH_UPDATE_4P; |
+ else if (touch_points == 3) |
+ return UMA_ET_GESTURE_PINCH_UPDATE_3; |
+ return UMA_ET_GESTURE_PINCH_UPDATE; |
+ } |
+ case ET_GESTURE_LONG_PRESS: |
+ return UMA_ET_GESTURE_LONG_PRESS; |
+ case ET_GESTURE_LONG_TAP: |
+ return UMA_ET_GESTURE_LONG_TAP; |
+ case ET_GESTURE_SWIPE: { |
+ int touch_points = gesture.details.touch_points(); |
+ if (touch_points == 1) |
+ return UMA_ET_GESTURE_SWIPE_1; |
+ else if (touch_points == 2) |
+ return UMA_ET_GESTURE_SWIPE_2; |
+ else if (touch_points == 3) |
+ return UMA_ET_GESTURE_SWIPE_3; |
+ return UMA_ET_GESTURE_SWIPE_4P; |
+ } |
+ case ET_GESTURE_WIN8_EDGE_SWIPE: |
+ return UMA_ET_GESTURE_WIN8_EDGE_SWIPE; |
+ case ET_GESTURE_TAP_CANCEL: |
+ return UMA_ET_GESTURE_TAP_CANCEL; |
+ case ET_GESTURE_SHOW_PRESS: |
+ return UMA_ET_GESTURE_SHOW_PRESS; |
+ case ET_SCROLL: |
+ return UMA_ET_SCROLL; |
+ case ET_SCROLL_FLING_START: |
+ return UMA_ET_SCROLL_FLING_START; |
+ case ET_SCROLL_FLING_CANCEL: |
+ return UMA_ET_SCROLL_FLING_CANCEL; |
+ case ET_GESTURE_TAP_UNCONFIRMED: |
+ return UMA_ET_GESTURE_TAP_UNCONFIRMED; |
+ case ET_GESTURE_DOUBLE_TAP: |
+ return UMA_ET_GESTURE_DOUBLE_TAP; |
+ default: |
+ NOTREACHED(); |
+ return UMA_ET_UNKNOWN; |
+ } |
+} |
+ |
+} // namespace ui |